非常感謝this post,我熟悉__block關鍵字。 它基本上意味着不復制實例,而只是傳遞它的原始參考。我認爲這樣做是目標C中的方法參數__block?
好處:
- 該實例所作的塊內的任何修改都會反映原始實例。
- 避免複製我們要在塊中使用的實例的「浪費」。
我很好奇,不過,有多少我們應該真正與這個聲明麻煩,例如,如果我有這個方法接收一個callback
塊作爲參數:
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback;
,讓我們說這個方法調用另一個回調作爲參數的方法。它是那麼值得__block
原callback
參數,如果我們想要把它下一個方法裏面:
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
__block MyTypeOfCallback blockCallback = callback;
[self doAnotherThingWithBlock:^(BOOL result) {
if (result)
blockCallback();
}];
}
,或者我應該簡單地調用next方法裏面原來block
參數?
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
[self doAnotherThingWithBlock:^(BOOL result) {
if (result)
callback();
}];
}
我這麼問是因爲它是有道理的包括__block選擇,但後來我又發現自己做了太多的地方,它開始採取許多行代碼。
順便說一句,這也適用於任何其他類型的參數,不僅塊。
沒有任何理由可言在你的例子使用'__block'。 '__block'的使用是當一個塊外聲明的變量需要在塊內部修改時。你沒有試圖重新賦值'callback',所以'__block'變量'blockCallback'沒有用處。 – rmaddy
好的,那麼避免複製該實例呢? – mllm
這不是你應該擔心的。讓編譯器做它的事情。開發人員不成熟的優化會導致比以往更多的問題。 – rmaddy