我有一個問題,ARC和塊,但已解決問題。不幸的是,我不知道究竟發生了什麼,希望更多地瞭解我的情況。使用塊和ARC導致「消息發送到解除分配的實例」錯誤
我本來是做這個
for(__block id<Foo> object in objects) {
foo download:someParm
success:^{
object.state = StateNewState;
}
];
}
這造成了一個失衡的保留代碼。當一個對象被訪問並且被認爲已經被釋放時發生崩潰。我寫了一個實現並使用「copy」屬性的類來創建一個successBlock屬性,該屬性保存了傳遞給下載函數成功參數的塊。我用下面的代碼替換了這個代碼
for(id<Foo> object in objects) {
foo download:someParm
success:^(id<Foo> successObject){
successObject.state = StateNewState;
}
];
}
沒有更多的釋放對象錯誤,但我還沒有運行儀器來檢查我是否沒有泄漏。一些如何使用__block導致對象被釋放太多次,我不知道爲什麼。我會繼續研究這個問題的原因,但我認爲這對其他人來說會是一個有趣的問題。
我想可能值得注意的是,對象數組是一個自動釋放數組,它是在本文前面寫下的代碼行中創建的。不要以爲這很重要,但我認爲我只是通過那裏。我放在這篇文章中的代碼並不是確切的代碼,因爲我正在使用這個工作,並且在那裏有一堆絨毛。但是for循環中沒有創建其他對象。
當應用程序崩潰時,它運行下載,然後運行回調,順便說一句,我使用ASIHttp。當我嘗試再次下載它時,它將運行並且不會調用回調,因爲對象已被釋放並且委託沒有被使用。在此之後,當對象被包含指向我們崩潰的對象的指針的字典訪問時。
我讀的文檔,並提醒使用__block用於不增加實例的實例變量的保留計數,通過使用__block指針自我引用內的變量使用塊。 我在想,如果使用__block不會增加對象的保留計數,那麼它是否也會是真的?id爲對象?因此當塊被釋放時造成保持不平衡導致對象也被釋放? –
Biclops