2013-05-07 97 views
0

我在嵌套塊中的__block變量有問題。我的問題是,應該像下面的代碼工作?__block變量嵌套塊的行爲

__block NSString* s = nil; 
[self methodWithBlock:^ 
{ 
    s = [self methodThatReturnsAnAutoreleasedString]; 
    [self methodWithBlock:^ 
    { 
     [NSLog @"%d", s.length]; 
    }]; 
}]; 

我假設內部塊保留s但這似乎並沒有在我的代碼的情況。當在內部塊中訪問s時,我得到一個「消息發送到解除分配的實例」。如果我在分配時保留s(s = [[self methodThatReturnsAnAutoreleasedString] retain];),它可以正常工作。

當然,這不是我的實際代碼,這是更復雜的,但我只是想知道這個最小的例子應該工作正常。如果是這樣,我需要在其他地方尋找我的問題。

+0

「如果我保留s時,我分配它(...),它工作正常。」是的,那就是你需要做的。另請注意,如果您在完成任務後未發佈它,它將會泄漏。 – newacct 2013-05-07 21:46:18

回答

3

(我假設你不使用ARC)從Transitioning to ARC Release Notes

在手動引用計數模式,__block id x;還沒有 保留x的效果。

所以你的假設是錯誤的,該塊不保留s。如果 methodWithBlock異步工作,則必須保留它。

+0

哦,我不知道__block在ARC和手動參考計數中的工作方式不同。謝謝! – 2013-05-07 19:44:42

+0

@MarianoRuggiero:不客氣。 - 是的,這是一個微妙的差異。幸運的是,我可以在所有項目中使用ARC :-) – 2013-05-07 19:49:45

+0

@MarianoRuggiero:是的,事實上,在MRC中,使用'__block'是使塊不保留捕獲變量的唯一方法。在ARC中,它們使用'__weak'或'__unsafe_unretained'來實現。 – newacct 2013-05-07 21:44:27