在声明 property
属性后,有2种实现选择:
(1)@synthesize
编译器期间,让编译器自动生成 getter/setter
方法。
当有自定义的存或取方法时,自定义会屏蔽自动生成该方法。
(2)@dynamic
告诉编译器,不自动生成 getter/setter
方法,避免编译期间产生警告,然后由自己实现存取方法。
或存取方法在运行时动态创建绑定:主要使用在 CoreData 的实现 NSManagedObject
子类时使用,由Core Data 框架在程序运行的时动态生成子类属性。
同时重写 getter/setter
方法
很少同时重写 getter/setter
方法,一般的话,大概都是使用懒加载方法,然后重写 getter
方法,做一个非空判断。要同时重写属性的 getter/setter
,系统就会报错误:Use of undeclared identifier '_string'; did you mean 'string'?
OC 最初设定 @property
和 @synthesize
的作用:
@property
的作用是定义属性,声明 getter/setter
方法。(注意:属性不是变量)
@synthesize
的作用是实现属性的,如 getter/setter
方法。
后来因为使用 @property
灰常频繁,就简略了@synthesize
的表达。
从 Xcode4.4 以后 @property
已经独揽了@synthesize
的功能。
主要作用:
(1)生成了私有的带下划线的的成员变量因此子类不可以直接访问,但是可以通过 getter/setter
方法访问。那么如果想让定义的成员变量让子类直接访问那么只能在.h文件中定义成员变量了,因为它默认是 @protected
。
(2)生成了getter/setter
方法的实现当:用 @property
声明的成员属性,相当于自动生成了 getter/setter
方法,如果重写了 getter/setter
方法,与 @property
声明的成员属性就不是一个成员属性了,是另外一个实例变量,而这个实例变量需要手动声明。所以会报错误。
总结:一定要分清属性和变量的区别,不能混淆。@synthesize
声明的属性=变量。意思是,将属性的 getter/setter
方法,作用于这个变量。
同时重写解决办法如下:
@interface ViewController ()
@property (nonatomic, strong)NSString *string;
@end
@implementation ViewController
//添加以下代码解决
@synthesize string = _string;
-(NSString *)string{
return _string;
}
-(void)setString:(NSString *)string{
_string = string;
}
-(void)viewDidLoad{
[super viewDidLoad];
}
@end
网友评论