小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

到底什么時候才需要在ObjC的Block中使用weakSelf/strongSelf

 方海龍的書館 2015-09-15

Objective C 的 Block 是一個很實用的語法,特別是與GCD結(jié)合使用,可以很方便地實現(xiàn)并發(fā)、異步任務。但是,如果使用不當,Block 也會引起一些循環(huán)引用問題(retain cycle)—— Block 會 retain ‘self’,而 ‘self‘ 又 retain 了 Block。因為在 ObjC 中,直接調(diào)用一個實例變量,會被編譯器處理成 ‘self->theVar’,’self’ 是一個 strong 類型的變量,引用計數(shù)會加 1,于是,self retains queue, queue retains block,block retains self。

解決 retain circle

Apple 官方的建議是,傳進 Block 之前,把 ‘self’ 轉(zhuǎn)換成 weak automatic 的變量,這樣在 Block 中就不會出現(xiàn)對 self 的強引用。如果在 Block 執(zhí)行完成之前,self 被釋放了,weakSelf 也會變?yōu)?nil。

示例代碼:

1
2
3
4
__weak __typeof__(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [weakSelf doSomething];
});

clang 的文檔表示,在 doSomething 內(nèi),weakSelf 不會被釋放。但,下面的情況除外:

1
2
3
4
5
__weak __typeof__(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [weakSelf doSomething];
    [weakSelf doOtherThing];
});

在 doSomething 中,weakSelf 不會變成 nil,不過在 doSomething 執(zhí)行完成,調(diào)用第二個方法 doOtherThing 的時候,weakSelf 有可能被釋放,于是,strongSelf 就派上用場了:

1
2
3
4
5
6
__weak __typeof__(self) weakSelf = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    __strong __typeof(self) strongSelf = weakSelf;
    [strongSelf doSomething];
    [strongSelf doOtherThing];
});

__strong 確保在 Block 內(nèi),strongSelf 不會被釋放。

總結(jié)

  • 在 Block 內(nèi)如果需要訪問 self 的方法、變量,建議使用 weakSelf。
  • 如果在 Block 內(nèi)需要多次 訪問 self,則需要使用 strongSelf。

參考

原文作者: lslin
原文鏈接: http://blog./blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block/
版權(quán)聲明:自由轉(zhuǎn)載-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多