2012-07-19 65 views
3

我有一個對象鏈。鏈中的對象存在很好地劃分功能。一個完成塊被傳遞到鏈中,我想如果另一個對象想要將東西添加到完成塊中,我可以將完成塊包裝在相同類型的塊中,調用第一個塊,並且一切都將是ace。我得到了EXC_BAD_ACCESS。我的語法錯了嗎?還是我完全用錯誤的方式處理了這個問題?將塊包裝在同一個塊中

-(void)archiveChatWithDictionary:(NSDictionary*)dictionary andCompletionBlock:(ServerConnectionCompletionBlock)completionBlock 
{ 
    ServerConnectionCompletionBlock localCompletionBlock = ^(ServerConnection *connection, NSError *error) { 

     // Do some stuff 
     // ... 

     // This line produces EXC_BAD_ACCESS 
     completionBlock(connection, error); 
    };  

    [self.chatEndpointInterface archiveChatWithDictionary: dictionary andCompletionBlock: localCompletionBlock]; 
} 
+0

調用'archiveChatWithDictionary:andCompletionBlock:'調用相同的方法(即與另一個類中名稱相同但實現不同的方法相反)。如果是這樣,你可能會有無限遞歸。 – newacct 2012-07-19 08:22:50

+0

這是一個ARC項目嗎? – 2012-07-19 19:42:28

+0

是的,它是一個ARC項目,不是該方法不調用它自己。 – 2012-07-19 19:44:01

回答

3

最後,是否將completionBlock複製(或內嵌在複製的塊中)?

默認情況下,塊存儲在堆棧上。如果你想保持一個塊(通常是一個完成塊),你必須複製它(所以它移動到堆)。

好處是,如果你複製一個塊,所有嵌套塊也將被複制。

+0

「最終」會發生什麼並不重要。蘋果的內存管理純粹是本地的。函數應該只關心它做什麼,而不是其他函數做什麼。他在那個需要複製的功能中沒有做任何事情。他不會將它存儲在函數調用後會持續的任何地方。 – newacct 2012-07-19 04:20:01

+0

這不是我的觀點,我沒有指向那個特定的功能,而是指向實際存儲塊的底層。 – Julien 2012-07-19 08:08:24

+0

好的,你可以更具體一點,它不需要在該功能中複製;但是在存儲塊的函數中(如果有這樣的函數)? – newacct 2012-07-19 08:28:17

0

我正在做同樣的事情,它的工作完美。

雖然我確實得到了這個崩潰,事實證明,包裝的塊是零。也許你可以檢查一下。

我建議斷言該塊不是零或在塊調用之前放置if語句,具體取決於您的特定情況。