2009-08-19 61 views
0

我有我認爲是一個奇怪的錯誤,但我當然是相對較新的iPhone開發,所以它可能不是所有這些奇怪畢竟。NSMutableArray刪除對象,但然後應用程序崩潰

我有一個數組(NSMutableArray)的對象,我跟蹤(每次用戶觸摸一個按鈕時添加到數組)我試圖做的是當數組達到一定的值我將新對象添加到數組的開頭,然後刪除數組中的最後一個對象。當我遍歷我的代碼時,所有工作都會刪除對象,但隨後應用崩潰了......當應用崩潰時,調試器不在任何代碼行,應用中沒有循環或定時器,所以我可以'不要想着其他任何正在運行的東西。

這裏是碰撞

if([objectArray count] > 10) 
{ 
    MyObject *objectToRemove = [[MyObject alloc] init]; 
    objectToRemove = [objectArray objectAtIndex:10]; 
    [objectArray removeObjectAtIndex:10]; 
    [objectToRemove removeFromSuperview]; 
} 

此代碼的主要一點是,每次用戶觸摸的按鈕的對象被添加到屏幕和顯示之前執行的代碼,然後當對象數量達到10並且用戶再次觸摸該按鈕,刪除已添加的第一個對象並顯示新對象。如果我註釋掉removeObjectAtIndex行,一切都按預期工作,但數組不斷增長。

我也嘗試刪除UIview被刪除後,該應用程序的行爲相同的方式刪除對象。如果我嘗試從不同索引的數組中刪除一個對象(I.E 3),該應用程序不會崩潰,但它不會給我預期的結果。但就像我說的代碼運行良好,當我檢查數組的執行前後數組的數量分別爲11和10。

你可以提供任何幫助,將不勝感激,

BWC

回答

6

我不認爲這做什麼,你認爲它。一行去一行:

MyObject *objectToRemove = [[MyObject alloc] init]; 

你分配類型MyObject來的」新對象

objectToRemove = [objectArray objectAtIndex:10]; 

你有什麼是在objectArray指數10覆蓋本地的MyObject指針您最初分配objectToRemove。現在泄露。

[objectArray removeObjectAtIndex:10]; 

現在你已經在指數10.刪除的對象。當你從數組中刪除它,它被釋放,它的引用計數減:T他的可能(或不可能)導致它被釋放。

[objectToRemove removeFromSuperview]; 

現在,您要發送消息給以前在objectArray中的對象。如果該對象被前面的代碼行解除分配,我會期待崩潰。

在聲明中撇開泄漏,您可能能夠做到這一點:

 objectToRemove = [[objectArray objectAtIndex:10] retain]; 
     [objectArray removeObjectAtIndex:10]; 
     [objectToRemove removeFromSuperview]; 
     [objectToRemove release]; 

這可以防止物體從你下被釋放出來,如果這就是爲什麼崩潰正在發生的事情。

確定我的場景是發生了什麼的一種方法是打開NSZombies,您可以通過將環境變量NSZombieEnabled設置爲YES來執行此操作。

1

如何:

MyObject *objectToRemove = [objectArray objectAtIndex:10]; 
[objectToRemove removeFromSuperview]; 
[objectArray removeObjectAtIndex:10]; 

removeFromSuperview將再次遞減保留計數上objectToRemove。 (removeFromSuperview意味着它被添加到以前的視圖,並保留它並將其保留計數遞增1)。 removeObjectAtIndex將再次遞減。但按照這個順序,當你仍然需要時,你很可能不會釋放它。 (當然,添加到數組中也保留它,所以順序可能不那麼重要)。

相關問題