-
@property 声明一个变量,格式就是@property (原子性,存储特性,存取特性,能否为空)变量类型 变量名
-
@synthesize 经常与 @property 搭配使用,声明在@implement 块中,表示自动合成getter和setter方法,同时可以为变量声明一个内部使用的别名,以区分setter和getter方法,别名外部不可见
-
有几种情况下@property不会为你合成变量
- 如果自己实现了setter和getter方法,而且没有用@synthesize 为变量生成别名,@property就不会为你自动合成带有下划线为开头的变量,如下
- 为readonly属性重写了getter方法
- 如果自己实现了setter和getter方法,而且没有用@synthesize 为变量生成别名,@property就不会为你自动合成带有下划线为开头的变量,如下
@dynamic 说明不用编译器生产这两个方法,不合成带有下划线的成员变量,由开发者自己实现
如果不进行实现却进行了调用的话,编译时期不会报错,但是执行期间就会报错
使用self.name 的形式,会调用 name 的 getter 方,注意代码中产生死循环,死循环写法
- 原子性 atomic 和 nonatomic 表示是否在为getter和setter方法上锁, 上锁可以保证一定的线程安全,但一般使用最多的是atomic
- 存储特性 copy, strong, weak, assign
- copy 表示调用setter方法时,将对传入的值进行拷贝,不会持有传入的对象,而是新开辟一块内存
- strong表示retain传入对象,持有该指针,增加该对象的引用计数,管理其生命周期
- weak 表示,指向该对象,但是不会持有对象,也不会增加引用计数,在该对象销毁时,指针会指向nil
- assign 作用与weak 相同,唯一的区别是,当对象销毁之后,指针不会指向nil,而是变成了野指针。
- 能否为空,nullable 和 nonnull
- 如果采用copy特性,属性需要遵守NSCopying协议,实现copyWithZone方法,如果想正确进行copy,属性的属性也需要考虑深拷贝问题.
- 参考blog