2012-01-02 61 views
2

我有一個方法的可可/ Objective-C類,看起來像這樣:調用從內部塊內的塊

- (void)doWork:(void (^)(void))handler 
{ 
    [self->someObject doActualWork:kWorkID handler:^(Result *result) { 
     if (handler) 
      handler(); 
    }]; 
} 

然而,當內塊被稱爲handler已dealloced和程序調用時會崩潰。據我所知,這是因爲該塊存儲在堆棧中,因此doWork:完成後不久就被刪除。我正在使用ARC。我應該怎麼做才能解決這個問題?

回答

4

首先,self->的iVar訪問是一個奇怪的,並鼓舞人心的模式,通常。

您是否在將它們存儲起來以備後用?如果這意圖是異步代碼,那麼你的方法應該在複製塊之前將其排入隊列。

即使在ARC下,而ARC會自動處理方法返回的塊,它不能自動處理塊作爲參數,並且您仍然需要複製它們。

如果這是純粹的同步代碼,那麼其他事情就會出錯。你需要提供更多的線索。

+0

我明白了。我沒有在'actualWork:handler:'中複製該塊。謝謝。 – 2012-01-02 20:33:47