第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)先級。
