assign,copy,strong,weak 修饰属性的区别

1,792 阅读2分钟

本人最近初学OC,研究了一下assign,copy,strong,retain,release四个属性,以前也听说过,但是没有细细的研究过,今天总结了一下,希望有不对的地方一起讨论,参考了这位大哥的文章

区别

他们的区别主要有两点

  1. 是否有对内存的拷贝
  2. 是否有引用计数增加

内存地址的拷贝

copy 修饰对象时重新申请一份内存地址进行赋值
assign、strong和weak不会有对内存的拷贝

引用计数改变

assign和weak 修饰对象时 引用计数不变
strong 引用计数+1,防止原值被释放
copy 重新申请一份内存地址,原引用计数不变,不互相影响

assign和weak 的区别

assign 和 weak 修饰属性时不会产生引用计数+1的操作,他们的区别是
weak 修饰的属性会在原属性引用计数为0时候自动置为nil,所以weak修饰的属性不能直接进行赋值操作(我的理解是因为weak修饰的属性不会引用计数+1所以一赋值就立刻为nil了),weak只可以修饰对象。如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。
assign修饰的属性虽然也没有产生引用计数+1的操作,但是当属性引用地址为0时,它只是进行值释放,不会有对这个指针地址的数据抹除操作,容易造成野指针。所以assign最好只修饰值/基础类型,不修饰指针类型的属性(可以修饰指针类型但是不安全),因为值类型的生命周期是由系统管理,存放在栈区,比较安全。

weak为啥不能修饰值类型呢

这里先留下一个点,后续有时间整理。