对于iOS开发者来说,相信大家对于Category 和 Protocol 肯定不会陌生,我们实际开发过程中100%会用到,但是在它们中添加和使用Property,你们真的非常熟悉吗?下面笔者就给大家梳理一下在Category和Protocol中添加和使用Property的知识。
1.什么是property?
中文翻译:合成存取器
@property的书写格式
@property (修饰列表) 变量类型 变量名;
- Xcode4.4之前
@property使编译器自动生成set/get方法声明。
@synthesize自动生成set/get方法的实现
@synthesize还会自动生成私有成员变量 - Xcode4.4以后
不用再写@synthesize,编译器通过@property就能给我们生成set/get方法的声明和实现,默认生成成员变量:_propertyName
用@property生成的成员变量是私有的。
当我们想改变默认的成员变量名时,@synthesize age = newName;
如果子类想访问父类的成员变量,
1、通过set/get方法
2、显式地声明成员变量
2.关于protocol中的property
在protocol中添加property时,其实就是声明了 getter和setter方法,在实现这个protocol协议的类中,我们要自己手动添加实例变量,并且需要实现setter/getter方法。
伪代码:
main.m
1 Student *student = [[Student alloc] init];
2
3 student.name = @"Liming";
4
5 NSLog(@"%@", student.name);
person.h
设置协议,与其中的property
#import <Foundation/Foundation.h>
@protocol personDelegate <NSObject>
@property (nonatomic, copy) NSString *name;
@end
@interface Person : NSObject
@end
student.h
生成成员变量, _name
#import <Foundation/Foundation.h>
#import "Person.h"
@interface Student : NSObject <personDelegate>
{
//***声明成员变量***
NSString *_name;
}
@end
student.m
这里写了两种方法,一种是自动实现setter/gerter,一种为手动setter/gerter
#import "Student.h"
@implementation Student
//------------------自动----------------------//
//@synthesize
//
//编译器期间,让编译器自动生成getter/setter方法。
//
//当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
//自动生成setter/getter方法
//@synthesize name;
//------------------手动----------------------//
//@dynamic
//
//告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告
//
//然后由自己实现存取方法
//实现Person中定义的属性name的set方法
- (void)setName:(NSString *)name {
_name = name;
}
//实现Person中定义的属性name的get方法
- (NSString *)name {
return _name;
}
@end
3.category中的property
在category中添加方法大家都很熟悉, 但是如何在category中添加成员变量呢?
1) 使用临时全局变量来替代成员变量
首先声明:Person没有name属性
main.m
导入头文件:
#import “Person+Extension.h”
Person *person = [[Person alloc] init];
person.name = @"peng";
NSLog(@"%@", person.name);
Person+Extension.h
#import "Person.h"
@interface Person (Extension)
@property (nonatomic, strong) NSString *name;
@end
Person+Extension.m
#import "Person+Extension.h"
#import <objc/runtime.h>
//***临时变量***
static NSString *_name;
@implementation Person (Extension)
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
2) 使用runtime关联对象实现成员变量
除了Person+Extension.m以外其他代码与第一种方法相同
Person+Extension.m
@implementation Person (Extension)
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self,@selector(name),name,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name{
NSString *n = objc_getAssociatedObject(self, @selector(name));
return n;
}