2012-02-19 18 views
-1

我正在學習Objecive-C並嘗試在循環中移除Object方法。 它無法正常工作。我收到「線程1:程序接收信號:」SIGABRT「。」在那條線上。 有什麼不對?Objective-C奇怪的錯誤SIGABRT

NSMutableArray *bookListMutable = [NSMutableArray arrayWithObjects:@"TitleM 2", @"TitleM 4", @"TitleM 5", nil]; 
[bookListMutable addObject:@"TitleM 3 added"]; 
[bookListMutable insertObject:@"TitleM 1 inserted" atIndex:0]; 

long countMutable; 
countMutable = bookListMutable.count; 


for(int y = 0; y < countMutable; y++){ 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

P.S. xCode 4.1

+1

1)時間更新,有一個Xcode 4.3。 2)SIGABRT通常是一個例外。你檢查了控制檯嗎? – 2012-02-19 20:44:52

+0

這是哪一行?另外,爲什麼不使用'removeObjectAtIndex:',或者'removeAllObjects' ?! – 2012-02-19 20:45:59

+0

我試圖從這本書做練習http://www.amazon.com/Objective-C-Absolute-Beginners-iPhone-Programming/dp/1430228326/ref=sr_1_2?ie=UTF8&qid=1329685777&sr=8-2 – 2012-02-19 21:10:42

回答

0

你不應該按照這個順序刪除項目。比方說,陣中擁有4項{0, 1, 2, 3}和模擬程序的執行:

  1. 第一次迭代與y = 0:在指數0{0, 1, 2, 3}刪除項目給予{1, 2, 3}

  2. 第二次迭代與y = 1:在指數1{1, 2, 3}刪除項目給予{1, 3}

  3. 第三次迭代與y = 2:在指數2{1, 3}刪除項目給出。糟糕,索引2處沒有項=>例外。

所以,你應該向後遍歷這樣的:

for(int y = countMutable-1; y >= 0; y--) { 
    [bookListMutable removeAtIndex:y]]; 
} 

或方法使用的生成:

[bookListMutable removeAllObjects]; 
+0

謝謝你非常清楚的解釋=) – 2012-02-19 22:13:26

2

問題是您要刪除錯誤順序的項目。一旦刪除索引0處的項目,所有索引都會減1。所以,你可以這樣做:

for(int y = countMutable-1; y >= 0; y--) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:y]]; 
} 

或本:

for(int y = 0; y < countMutable; y++) { 
    [bookListMutable removeObject:[bookListMutable objectAtIndex:0]]; 
} 

(我把這個作爲一個小的修改你的代碼,而是想指出,有更好的方法來做事像這樣,例如使用removeObjectAtIndex:。請參閱文檔:https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSMutableArray_Class/Reference/Reference.html

+0

謝謝你,現在它工作。 – 2012-02-19 21:09:05

1

我發現很多可能與代碼有關的錯誤,但最糟糕的是:您正在從索引0開始刪除數組中的對象,繼續計數。這將意味着i = 0,1,2,3,而數組繼續將元素移回到位置0.這肯定會拋出異常,並且只能以這種方式擦除數組的一半。

替代方案:使用清除陣列([bookListMutable removeAllObjects])的方法,或者從迭代計數下降到0