Objective-C奇怪的错误SIGABRT

问题描述:

我正在学习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

你不应该按照这个顺序删除项目。比方说,阵中拥有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

问题是您要删除错误顺序的项目。一旦删除索引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

我发现很多可能与代码有关的错误,但最糟糕的是:您正在从索引0开始删除数组中的对象,继续计数。这将意味着i = 0,1,2,3,而数组继续将元素移回到位置0.这肯定会抛出异常,并且只能以这种方式擦除数组的一半。

替代方案:使用清除阵列([bookListMutable removeAllObjects])的方法,或者从迭代计数下降到0