iOS strong和copy assign与weak

2020-04-29  本文已影响0人  Rockerliang

strong和copy

所以,如果源字符串是NSMutableString的时候,使用strong只会增加引用计数。
但是copy会执行一次深拷贝,会造成不必要的内存浪费。而如果原字符串是NSString时,strong和copy效果一样,就不会有这个问题。

assign与weak

我们都知道,assign用来修饰基本数据类型,weak用来修饰OC对象。
其实照理,assign也能修饰OC对象,但是assign修饰的对象在该对象释放后,其指针依然存在,不会被置为nil——这就造成了一个很严重的问题:出现了野指针。当访问这个野指针时,指向了原地址,而原地址有两种情况:

第一种情况:原地址没有改变,代码运行通过,但很有可能有逻辑bug。
第二种情况:原地址已经改变,结果不可预测,多数崩溃,也有可能出现其他莫名错误。

但是用weak来修饰的话,对象释放的时候会把指针置为nil,从而避免了野指针的出现。
那又有个疑问出现了,凭什么基本数据类型就可以使用assign。这就要扯到堆和栈的问题了,基本数据类型会被分配到栈空间,而栈空间是由系统自动管理分配和释放的,就不会造成野指针的问题。

weak 修饰的指针变量,在指向的内存地址销毁后,会在 Runtime 的机制下,自动置为 nil。
_Unsafe_Unretain不会置为 nil,容易出现 悬垂指针,发生崩溃。但是 _Unsafe_Unretain 比 __weak 效率高。

上一篇下一篇

猜你喜欢

热点阅读