2012-06-22 121 views
2

我有這種方法,當我按下按鈕並從MutableArray中刪除一個對象時會被調用。由於它在陣列中留下漏洞,我以後遇到問題。有沒有簡單的方法來消除這些「漏洞」,或更好的方法來刪除對象?從NSMutableArrays中刪除對象

- (IBAction)addfavs:(id)sender { 

int erase; 
for(int i=0;i<favs.count;i++){ 

    if ([favs objectAtIndex:i] == parent) { 

     [favs removeObjectAtIndex:i]; 
     erase = 1; 
    } 
} 
if (!erase) { 
    [favs addObject:parent]; 
} 

}

+0

你碰到什麼類型的問題?順便說一句:如果(擦除)...可能無法一直工作。因爲擦除可以有一個隨機數... – user523234

回答

4

[EDIT4]

大點的user523234

[favs removeObjectIdenticalTo: parent]; 

看removeObjectIdenticalTo在蘋果網站的NSMutableArray

https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

[EDIT3]

以下是使用值(使用整數值)而不是對象本身進行檢查的示例。

int erase = 0; 
int i = 0; 
while(i < favs.count){ 
    if ([[favs objectAtIndex:i] intValue] == [parent intValue]){ 
     [favs removeObjectAtIndex:i]; 
     erase = 1; 
    }else{ 
     i++; 
    } 
} 

[EDIT2]

它可能會增加,即使它不刪除第一個對象的原因是因爲你永遠不重置「抹掉」變量。第一次你把它設置爲1,這是爲其餘的時間設置的!你也永遠不會初始化它,因此你永遠不會「真正」知道編譯器將如何處理你的動作被調用的NEXT時間。如果它爲你的擦除變量「分配」相同的內存地址,那麼即使你沒有將其定義爲一個靜態變量,「1」仍將駐留在靜態條件中!

[編輯]

Didnt原本明白你的問題。我想我現在明白了,更好地審視你的代碼。

代碼:

int erase = 0; 
for(int i=0;i<favs.count;i++){ 
    if ([favs objectAtIndex:i] == parent){ 
     [favs removeObjectAtIndex:i]; 
     erase = 1; 
    } 
} 

你基本上是在做什麼將跳過某些項目在列表中,你增加你的每一個櫃檯後刪除。可以說你移除了對象3,你的計數器現在將更新爲4,但現在4是5,現在3是4,所以在本例中你基本上正在跳過第4項。

試試這個:

int erase = 0; 
int i = 0; 
while(i < favs.count){ 
    if ([favs objectAtIndex:i] == parent){ 
     [favs removeObjectAtIndex:i]; 
     erase = 1; 
    }else{ 
     i++; 
    } 
} 

如果您沒有刪除當前項目這將只升級計數器。

[原稿] https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

看那removeObjectAtIndex方法的註釋。

直接從蘋果:

「填補了國內空白,超越指數的所有元素都從他們的指數減去1感動。」

這應該在Apple的API中自動完成。你不應該做任何事情,真的不應該有任何「漏洞」。

+0

哦,我沒有注意到,但數組不應該有重複的對象,所以不是問題。它仍然無法正常工作。有時它會跳過刪除部分並添加一個對象,從而創建重複項,並且如果再次調用,僅刪除其中的一個,即使使用更新後的代碼... – user1447339

+0

什麼是父母呢?數組中的對象是什麼?也可以跳過刪除部分並添加父類型對象的原因是,您永遠不會重置您的擦除變量。 – trumpetlicks

+0

int erase = 0;在開始時應該重置它。父母是一個NSNumber。 – user1447339

4

當您從一個可變的數組的對象,它不會「留下一個洞」。可變數組中的每個其他對象只是向下移動一個凹槽,並且數組的計數(或長度)會縮減已移除的對象的數量。

如果您在用戶界面中看到「漏洞」,則可能無法使用表視圖刷新方法,或者顯示數組內容。但是基本的可變數組類肯定知道如何處理刪除和添加和管理自己的對象。

+0

我其實認爲如果你讀他的代碼,他的問題是錯誤地陳述。我認爲他的漏洞是他正在刪除的WAY的人工產物,因爲他每次刪除對象時都可能跳過列表中的項目! – trumpetlicks

+0

gah ...你是對的。 +1給你。我很失望,這個問題並沒有讓我能夠幫助他更快地做出正確答案。 –

+0

大聲笑,對:-)由於語言障礙,我曾經發生過這麼多次,它只是讓我笑! – trumpetlicks

2

從NSMutableArray中刪除對象不會留下空洞。 Apple的數組實現不是稀疏的,這意味着當您刪除一個對象以便沒有空格時,該數組將被調整大小。

+0

我其實認爲如果你讀他的代碼,他的問題是錯誤地陳述。我認爲他的漏洞是他正在刪除的WAY的人工產物,因爲他每次刪除對象時都可能跳過列表中的項目! – trumpetlicks

+0

很好的通話,甚至沒有抓住它。 – Dima

1

除了@trumpetlicks的答案,你也可以試試這個:
編輯:較短的版本。

+0

其實更好的是:[favs removeObjectIdenticalTo:parent];如果你看一下定義,它將刪除與所有父母相同的「ALL」實例! +1 – trumpetlicks