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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

简谈造成循环引用的原因以及处理办法

發布時間:2024/10/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简谈造成循环引用的原因以及处理办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前段時間寫項目的時候我在每個block使用前我都加了一個__weak來修飾用@property描述的屬性,項目寫的差不多了回頭來反思,總覺得這種寫太麻煩了,回想起來,還是由于自己對于循環引用造成的原因理解不夠透徹,才導致做了很多的無用功。

廢話不多說,上代碼了 :

? ??/*

? ? // way 1? 獲取數據

? ? model = [[MoveModel alloc] init];

? ? model.successBlock = ^(id returnBlock) {

? ? ? ? NSArray *array = (NSArray *)returnBlock;

? ? ? ? _dataArray = array;

? ? ? ? [mainTableview reloadData];

? ? };

? ? [model getMoveData];

? ? */

?

? ??/*

? ? // way 2 獲取數據

? ? [MoveModel GetDataSuccessBlock:^(id returnValues) {

? ? ? ? NSArray *array = (NSArray *)returnValues;

? ? ? ? _dataArray = array;

? ? ? ? [mainTableview reloadData];

? ? }];

?? ? */

這兩種方式都是從別的類中獲取數據的方法,way1采用的是屬性block,way2采用的是參數block,而block內部的數據處理方式是一樣的,但事實是way1造成了循環引用,而way2卻沒有。---不要問我怎么知道的,我就是知道~~

?

block在iOS開發中視為對象因此生命周期會一直等到持有者的生命周期結束了才會結束另外一方面

由于block的捕獲變量的機制使得block的對象也可能被block持有從而造成循環引用造成內存泄露

?

第一種情況就是這樣的,block在控制器內部實現的,它的持有者是控制器本身,而在block內部又調用了_dataArray,它又持有了控制器。最終內存泄露了。

?

解決辦法: 1:聲明?weakSelf

?

typeof(self) __weak weakSelf = self

?

block內部的_dataArray 換成weakSelf.dataArray

?

但是這樣又會產生另外一種特殊情況,就是在回調block的時候,block中的對象很有可能已經釋放了,找不到對象會導致crash。這種情況比較少見,但是需要防范。

?

2 在block內部在聲明一個_strong 來修飾weakSelf 就行了。

?

下面是afnetworking中的源碼,既處理了循環引用的問題,又防范了突發情況的產生,處理方式值得借鑒:

__weak __typeof(self)weakSelf = self;

? ? AFNetworkReachabilityStatusBlock callback = ^(AFNetworkReachabilityStatus status) {

? ? ? ? __strong __typeof(weakSelf)strongSelf = weakSelf;

? ? ? ? strongSelf.networkReachabilityStatus = status;

? ? ? ? if (strongSelf.networkReachabilityStatusBlock) {

? ? ? ? ? ? strongSelf.networkReachabilityStatusBlock(status);

? ? ? ? }

? ? };

?

?

?

?

?

轉載于:https://www.cnblogs.com/110-913-1025/p/6993684.html

總結

以上是生活随笔為你收集整理的简谈造成循环引用的原因以及处理办法的全部內容,希望文章能夠幫你解決所遇到的問題。

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