我们每天都撸着Property,它是Objective-C的关键词;
@Property是声明属性的语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器(实例变量的赋值和取值)。
@property 的本质
@property = ivar + getter + setter;
ivar(实例变量)、存取方法(access method = getter + setter)
有了 @property 的属性声明,不必进行实例变量{}的声明,系统默认生成并在 m 文件中生成对应的 _propertyName ;
@synthesize 和 @property 都是编译器特性,自动生成这两个实例变量的存取器,并且隐藏了存取器;
自动生成存取器的方法,比我们手动声明的更简单更方便,且适用于点语法,不需要进行消息发送语法;系统默认 “_XXX”;
自定义应避免无限循环问题
- (void)setVar:(id)newVar {
self.var = newVar;
}
- (void)var {
return self.var;
}
@Property 关键字
- 原子性
- 存取器控制
- 内存管理
默认的配置属性都是什么: < atomic, readwrite,assign >
对于在swift中 ? 和 !去显式声明一个对象或者方法的参数是 optional 还是 non-optional,而在 Objective-C 中则没有这一区分,这样就会带来问题:在 Swift 与Objective-C 混编时,Swift 编译器会隐式地都当成是 non-optional;因此 WWDC 2015 为oc新增特性: Nullability (nonnull nullable null_resettable);
@dynamic
@dynamic 告诉编译器属性的setter与getter方法由用户自己实现,不自动生成。
需要注意编译可通过,但是运行时动态绑定对应方法,否则会导致Crash;
有些存取是在运行时动态创建的,如在CoreData的NSManagedObject类使用的。
用@dynamic修饰的属性,core data 框架会在程序运行的时候为此类属性生成getter和setter方法。
网友评论