簡體   English   中英

NSMutableArray刪除對象,但應用程序崩潰

[英]NSMutableArray removing the object but then app crashes

我有一個我認為是奇怪的錯誤,但是我當然對iPhone開發而言還比較陌生,因此可能畢竟不是那么奇怪。

我有一個要跟蹤的對象數組(NSMutableArray)(每次用戶觸摸按鈕時都會向該數組添加一個對象),我想做的是當數組達到某個值時我添加新對象到數組的開頭,然后刪除數組中的最后一個對象。 當我單步執行代碼時,所有工作正常的對象均被刪除,但是應用程序崩潰了……當應用程序崩潰時,調試器不在任何代碼行上,並且應用程序中還沒有循環或計時器,因此我可以想不到正在運行的任何其他東西。

這是崩潰之前立即執行的代碼

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

該代碼的主要要點是,每次用戶觸摸按鈕時,都會將一個對象添加到屏幕上並顯示,然后當對象數達到10並且用戶再次觸摸該按鈕時,將刪除添加的第一個對象,並且顯示新對象。 如果我注釋掉removeObjectAtIndex行,那么一切都會按預期進行,但是數組會繼續增長。

我也嘗試過在刪除UIview之后刪除對象,並且應用程序的行為方式相同。 如果我嘗試從另一個索引(IE 3)的數組中刪除一個對象,則該應用程序不會崩潰,但是並不能達到預期的效果。 但是就像我說的那樣,代碼運行良好,當我在執行該行之前和之后檢查數組的計數時,該值分別為11和10。

您能提供的任何幫助將不勝感激,

《生物武器公約》

我認為這並沒有您認為的那樣。 逐行:

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

您分配類型為“ MyObject”的新對象。

objectToRemove = [objectArray objectAtIndex:10];

您用objectArray的索引10處的內容覆蓋了本地MyObject指針。 您最初分配的objectToRemove現在泄漏了。

 [objectArray removeObjectAtIndex:10];

現在,您已在索引10處刪除了該對象。將其從數組中刪除時,該對象將被釋放,並且其引用計數將減少。 這可能會(也可能不會)導致它被釋放。

 [objectToRemove removeFromSuperview];

現在,您正在向對象數組中以前的對象發送一條消息。 如果對象由上一行代碼釋放,則可能會發生崩潰。

在聲明中撇開泄漏,您可以執行以下操作:

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

如果這就是崩潰發生的原因,這將防止從您下方釋放該對象。

確定我的場景是否正在發生的一種方法是打開NSZombies,可以通過將環境變量NSZombieEnabled設置為YES來完成。

怎么樣:

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

removeFromSuperview將對objectToRemove減少一次保留計數。 (removeFromSuperview意味着它先前已添加到視圖中,並且已經保留了該視圖,並將其保留計數增加了一個)。 removeObjectAtIndex會再次減少它。 但是按照這種順序,當您仍然需要它時,您很可能不會釋放它。 (當然,添加到數組也會保留它,因此順序可能並不那么重要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM