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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Block的循环引用

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Block的循环引用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

在ios常見的循環引用中曾經提到過block:

看看上面最基本的block循環應用,self包含block,block包含了self中的變量val,所以形成了循環應用,編譯器給出了循環引用的警告,當然不是所有的block循環引用編譯器都能給出警告,所以不要只依賴編譯器的警告來判斷循環引用,如:

解決的辦法當然是使用__weak來修飾self

__weak typeof(self) weakSelf = self; blkk = ^{[weakSelf showLog]; }; blkk();

-------------------------------凌亂分割線-------------------------------

正常在棧上的block引用self是不會引起循環應用的,所以可以不使用weak來修飾self

void (^blkk)(void) = ^{[self showLog]; }; blkk();

但是因為block的使用附有__strong的原因,雖然不會有循環引用,但是也會起到延長self對象的生命周期的效果,直到棧上的block釋放了,才會釋放self。

因此釋放self可能會讓程序出現問題,假如self監聽了某些通知而修改公共資源什么的,所以這種情況下最好也使用weakself。

當然你也可能不希望self提前釋放,因為你的block回調后需要進行完整操作,假如self釋放了,你無法在block回調后來處理一些其他的事情,這時候你可以選擇不使用weakself,也可以使用weakself+strongself。先看看weakself+strongself的寫法:

__weak __typeof__(self) weakSelf = self;createdTask = [self.sessionManagerdataTaskWithRequest:requestcompletionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {dispatch_async(self.responseQueue, ^{__strong __typeof__(weakSelf) strongSelf = weakSelf; .....

上面是AFNetworking的源碼,在block前用了weakself,在block里用了strongself,這樣做和直接不使用weakself有什么區別呢。

?block回調前結束selfblock回調后結束self
不使用weakselfself 不釋放self不釋放
weakself+strongselfself已釋放self不釋放
使用weakselfself已釋放self已釋放

所以根據情況的不同,大家可以選擇使用哪種方式。當然最無腦的推薦還是使用weakself

轉載于:https://my.oschina.net/iq19900204/blog/739755

總結

以上是生活随笔為你收集整理的Block的循环引用的全部內容,希望文章能夠幫你解決所遇到的問題。

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