iOS 属性修饰符

仅供自己复习使用,不具有商业参考价值

@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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容