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

本人最近初学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为啥不能修饰值类型呢

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

相关文章
相关标签/搜索