使用Blocks來進行工作(三)

一個Block永遠是一個方法中的最后一個參數(shù)

最好的實踐就是在一個方法中只使用一個block參數(shù)墙基,如果這個方法同樣需要其他非block的參數(shù)残制,那么這個block需要放在最后。

- (void)beginTaskWithName:(NSString *)name completion:(void(^)(void))callback;

當指定的block內(nèi)嵌的時候颗祝,這種寫法會使得該方法閱讀起來更簡單,像下面這樣:

[self beginTaskWithName:@"MyTask" completion:^{
        NSLog(@"this task is complete");
}];

使用類型定義來簡化block的語法

如果你需要定義多個相同簽名的block搁宾,你可能會為這個簽名定義一個你獨有的類型倔幼。
舉個例子來說,你可以為一個簡單的沒有任何變量和返回值的block定義一個類型翩腐,像下面這樣:

typedef void (^XYZSimpleBlock)(void);

然后你可以在這個方法參數(shù)中或者在創(chuàng)建block變量的時候膏燃,使用你的自定義類型:

XYZSimpleBlock anotherBlock = ^{
        ...
};
- (void)beginFetchWithCallbackBlock:(XYZSimpleBlock)callbackBlock {
        ...
        callbackBlock();
}

自定義類型的定義實際上在處理blocks返回blocks或者獲取其他blocks作為參數(shù)的時候非常有用蹄梢。思考一下下面這個例子:

void (^(^complexBlock)(void(^)(void)))(void) = ^ (void (^aBlock)(void)) {
        ...
        return ^ {
                ...
        };
}

這個complexBlock變量指的是一個用其他block(aBlock)作為參數(shù)冰返回另一個block的block。重寫代碼來增加類型定義可讀性:

XYZSimpleBlock (^betterBlock)(XYZSimpleBlock) = ^(XYZSimpleBlock aBlock) {
        ...
        return ^{
                 ...
        };
}

Objects使用屬性來持續(xù)跟蹤Blocks

用定義屬性來跟蹤block和一個block變量的語法很相似:

@interface XYZObject : NSObject
@property (copy) void (^blockProperty)(void);
@end

注意:你要使用copy來修飾這個屬性而咆,因為我們需要復制block來跟蹤它超出原始范圍的捕捉狀態(tài)幕袱。當使用自動引用計數(shù)的時候就不是一些你需要去擔心的事情,因為它會自動發(fā)生涯捻,但是對于這個屬性修飾來說最好的方式就是去展示行為結(jié)果障癌。
一個block屬性設(shè)置或者調(diào)用可以像任何其他block變量一樣:

self.blockProperty = ^ {
        ...
};
self.blockProperty();

同樣的可以用類型定義來對這個block屬性進行修飾轿亮,像下面:

typedef void (^XYZSimpleBlock)(void);

@interface XYZObject : NSObject
@property (copy) XYZSimple blockProperty;
@end

當捕捉self的時候避免強引用循環(huán)

如果你需要去在block中捕捉self的時候但骨,例如當定義一個callback的block补履,考慮內(nèi)存管理的影響很重要。blocks對任何被捕捉的對象都持有一個強引用,包括self野蝇,這意味著它很容易結(jié)束強引用周期乍狐,例如烫罩,一個對象持有一個捕捉self的并且具有copy的屬性的block:

@interface XYZSimpleBlockKeeper : NSObject
@property (copy) void (^block)(void);
@end
@implementation XYZBlockKeeper
- (void)configureBlock {
        self.block = ^{
                [self doSometing];
        };
}

這個例子浊伙,編譯器會發(fā)出警告串结,但是一個更復雜的例子可能涉及多個對象之間的強引用來創(chuàng)建循環(huán)卧蜓,代碼將會變得更加難診斷盛霎。為了避免這個問題凤薛,最好的辦法就是捕捉一個self的弱引用,像下面這樣:

- (void)configureBlock {
        XYZBlockKeeper *__weak weakSelf = self;
        self.block = ^ {
                 [weakSelf doSomething];
        }
}

通過捕捉self的弱指針,block將不會持有與XYZBlockKeeper對象的強引用關(guān)系。如果這個對象在block調(diào)用之前被釋放掉了,這個weakSelf指針將會很直接的就被重置成nil。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末领虹,一起剝皮案震驚了整個濱河市蝠嘉,隨后出現(xiàn)的幾起案子杜恰,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件圃郊,死亡現(xiàn)場離奇詭異逸寓,居然都是意外死亡勋篓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門钱豁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谤碳,“玉大人,你說我怎么就攤上這事。” “怎么了窜锯?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵工秩,是天一觀的道長眉菱。 經(jīng)常有香客問我酥郭,道長椿息,這世上最難降的妖魔是什么枫耳? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任警医,我火速辦了婚禮突颊,結(jié)果婚禮上糙申,老公的妹妹穿的比我還像新娘扛邑。我一直安慰自己,他們只是感情好樟氢,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布眶掌。 她就那樣靜靜地躺著明垢,像睡著了一般谷醉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上斯够,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天束亏,我揣著相機與錄音,去河邊找鬼矮烹。 笑死罩锐,一個胖子當著我的面吹牛仁期,可吹牛的內(nèi)容都是我干的押框。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼最域,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起纺非,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垒手,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體科贬,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年憎账,在試婚紗的時候發(fā)現(xiàn)自己被綠了胞皱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡反砌,死狀恐怖宴树,靈堂內(nèi)的尸體忽然破棺而出酒贬,到底是詐尸還是另有隱情锭吨,我是刑警寧澤寒匙,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布蒋情,位于F島的核電站,受9級特大地震影響耸携,放射性物質(zhì)發(fā)生泄漏棵癣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一夺衍、第九天 我趴在偏房一處隱蔽的房頂上張望狈谊。 院中可真熱鬧,春花似錦、人聲如沸河劝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赎瞎。三九已至牌里,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間务甥,已是汗流浹背牡辽。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留敞临,地道東北人态辛。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓编矾,卻偏偏與公主長得像洽沟,于是被迫代替她去往敵國和親怒详。 傳聞我的和親對象是個殘疾皇子昆烁,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容