6.塊與大中樞派發(fā)

第37條 理解 block 這一概念

block里可以直接修改成員變量的值,而不用 __block 修飾。
如果block里調(diào)用了成員變量也會(huì)間接地保留self。


block的內(nèi)部結(jié)構(gòu)

其中最重要的就是invoke變量,這是個(gè)函數(shù)指針,指向block的實(shí)現(xiàn)代碼。
block會(huì)把所有調(diào)用的變量都copy一份,注意,并不是copy對象本身,而是指向這些對象的指針變量。



全局塊:空block或不調(diào)用任何外面變量的block。
棧塊:調(diào)用了外部變量,只會(huì)被執(zhí)行一次,執(zhí)行結(jié)束后會(huì)被系統(tǒng)釋放。
堆塊:被copy到堆中的block。

第38條 為常用的block創(chuàng)建typedef

有時(shí)候同一個(gè)block,不同的功能,可以定義兩個(gè)typedef,以便區(qū)別不同的功能。

第39條 用handle塊降低代碼分散程度

設(shè)計(jì)block方法時(shí),如果想修改block的回調(diào)線程,可以增加一個(gè)queue的參數(shù)。

第40條 用block引用其所屬對象時(shí),避免保留環(huán)

- (void)method
 {
    [self.teacher requestData:^(NSData *data) {
        self.name = @"name";
        self.teacher = nil;//加上這句可以避免循環(huán)引用,但是若該方法未被調(diào)用,則內(nèi)存還會(huì)泄漏
    }];
}
- (void)backButtonClick:(id)sender
{
    if (self.backButtonBlock != nil) {
        self.backButtonBlock();
    }
    self.backButtonBlock = nil;//此處加上該代碼,可以讓調(diào)用者不用管內(nèi)存問題,即使不用weakSelf也不會(huì)泄露
}

第41條 多用派發(fā)隊(duì)列,少用同步鎖

第42條 多用GCD,少用performSelector系列方法

第43條 掌握GCD及操作隊(duì)列的使用時(shí)機(jī)

使用NSOperationQueue的好處:
1.取消某個(gè)操作。NSOperation有專門的cancel方法,不過已經(jīng)啟動(dòng)的任務(wù)無法取消。
2.可以指定依賴關(guān)系。GCD也可以實(shí)現(xiàn),但是沒NSOperationQueue方便,特別是復(fù)雜的隊(duì)列依賴關(guān)系。
3.NSOperation有很多屬性,如,isCanceled、isFinished,可以方便的監(jiān)聽各個(gè)任務(wù)的狀態(tài)。
4.可以方便的設(shè)置任務(wù)優(yōu)先級。

第44條 通過Dispatch Group機(jī)制,根據(jù)系統(tǒng)資源狀況執(zhí)行任務(wù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容