仅供自己复习使用,不具有商业参考价值
@property
- 当属性用其修饰时,编译器会为开发者创建 setter/getter 方法并同时生成一个以下划线开头的成员变量
内存管理语义strong,weak,assign,copy,unsafe_unretained
- strong 表示一种拥有关系。为属性设置新值的时候,设置方法会保留新值(引用计数加一),并释放旧值(旧值的引用计数减一),然后将新值赋值上去。相当于MRC下的retain
- copy修饰的属性设置新值的时候,当新值是不可变的,和strong是一模一样的。当新值是可变的(开头是NSMutable),设置方法不会保留新值(新值的引用计数加一),而是对新值copy一份,不会影响新值的引用计数。copy常用来修饰NSString,因为当新值是可变的,防止属性在不知不觉中被修改。
- weak表示一种非拥有关系。用weak修饰属性的时候,为属性设置新值,设置方法不保留新值,也不释放旧值。当属性所指的对象释放的时候,属性也会被置为nil
- assign 既可以修饰基本数据类型,也可以修饰对象。当修饰对象时和weak一样对象的引用计数不会加一,区别就是 weak 修饰的属性会在原属性引用计数为0时候自动置为nil 。但是assign 修饰时 当属性引用计数为0时,它只是进行值释放,不会有对这个指针地址的数据抹除操作,容易造成野指针。所以assign最好只修饰值/基础类型,不修饰指针类型的属性(可以修饰指针类型但是不安全),因为值类型的生命周期是由系统管理,存放在栈区,比较安全。
- unsafe_unretained用来修饰属性的时候,和assing修饰对象的时候是一模一样的。为属性设置新值的时候,设置方法既不会保留新值(新值的引用计数加一),也不会释放旧值(旧值的引用计数减一)。唯一的区别就是当属性所指的对象释放的时候,属性不会被置为nil,这就会产生野指针,所以是不安全的。
@synthesize
- 为属性添加一个实例变量名,或者说别名。同时会为该属性生成setter/getter方法。如果不写,默认是 @synthesize var = _var。
- 当在protocol中声明并实现属性时,协议中声明的属性不会自动生成setter和getter 需要使用@synthesize 生成setter和getter
- @synthesize 要写在 @implementation 代码实现内
@dynamic
- 属性的setter和getter 方法由用户自己实现,不自动生成(当然对于readonly的属性只需要提供getter即可)
参考资料
https://www.jianshu.com/p/e7ae9577e6e7
https://www.jianshu.com/p/060e43566ab5