日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 自动内存管理 ARC

發布時間:2024/1/17 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;?? //現在所有的指針都為nil

weak的特性,如果指向的內存被釋放了,則自動指向 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。