ios 自动内存管理 ARC
生活随笔
收集整理的這篇文章主要介紹了
ios 自动内存管理 ARC
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
今天在公司爆出一個 BUG,導致5000+crash.
大致是 UIKit 中的 delegate 訪問了已經釋放了的界面,也就是使用了野指針導致 crash.
回來演示了一下發現
@property?(nonatomic,?assign)?id<MyCellDelegate>?delegate;//1 @property?(nonatomic,?weak)?id<MyCellDelegate>?delegate;//2大部分的 UIKit 的 delegate 都是如1的聲明
因為 ios 在5之前是沒有 ARC 的,為了兼容所以寫的都是 assign
那么 assign 與 weak 有什么區別呢?
__strong?NSString?*yourString?=?[[NSString?alloc]?initWithUTF8String:"your?string"]; __weak??NSString?*myString?=?yourString;??? yourString?=?nil;??? __unsafe_unretained?NSString?*theirString?=?myString;?? //現在所有的指針都為nilweak的特性,如果指向的內存被釋放了,則自動指向 nil;
所以使用 weak 是不會有野指針的
而 assign 和unsafe_unretained,永遠指向某內存地址,如果該內存被釋放了,自己就會成為野指針
如下
__strong?NSString?*yourString?=?@"Your?String";??? __weak??NSString?*myString?=?yourString;??? __unsafe_unretained?NSString?*theirString?=?myString;?? yourString?=?nil;??? //現在yourString與myString的指針都為nil,而theirString不為nil,但是是野指針。所以我們在使用 UIKit 中的 delegate 的時候,要避免響應 delegate 的VC,或者 View 之類的實例被提前釋放了,而導致 crash
而我們自己的 delegate 可以直接寫成 weak 的,既避免了循環引用,又不會產生野指針.
PS:assign 只能用在屬性的定義,變量的定義就可以用類似的 unsafe_unretained
that`s all...?
轉載于:https://my.oschina.net/jilin/blog/373066
總結
以上是生活随笔為你收集整理的ios 自动内存管理 ARC的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android ViewGroup点击效
- 下一篇: java命令详解 java -D