第37條 理解 block 這一概念
block里可以直接修改成員變量的值指攒,而不用 __block 修飾。
如果block里調(diào)用了成員變量也會(huì)間接地保留self僻焚。
其中最重要的就是invoke變量允悦,這是個(gè)函數(shù)指針,指向block的實(shí)現(xiàn)代碼虑啤。
block會(huì)把所有調(diào)用的變量都copy一份隙弛,注意,并不是copy對(duì)象本身狞山,而是指向這些對(duì)象的指針變量全闷。
全局塊:空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引用其所屬對(duì)象時(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)先級(jí)。