2020-01-08

2020-02-05  本文已影响0人  flyinskybiu

strong、weak、assign、unsafe_unretained


strong 和 weak

strong 是每对这个属性引用一次,retainCount 就会+1,只能修饰 NSObject 对象,不能修饰基本数据类型。是 id 和 对象 的默认修饰符。

weak 对属性引用时,retainCount 不变,只能修饰 NSObject 对象,不能修饰基本数据类型。 主要用于避免循环引用


assign

这个关键字,是默认关键字,可以修饰基本数据类型和 NSObject 对象。 对这个关键字声明的属性操作时,retainCount 是一直不变的,一直为 1,只有主动调用 release 时 ,才会释放。 但是为什么我们不会用assign去声明对象呢? 这是因为 assign 修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会 crash。 为什么可以用assign修饰基本数据类型? 因为基础数据类型是分配在栈上,栈的内存会由系统自己自动处理回收,不会造成野指针。

上一篇下一篇

猜你喜欢

热点阅读