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
你不应该按照这个顺序删除项目。比方说,阵中拥有4项{0, 1, 2, 3}
和模拟程序的执行:
第一次迭代与
y = 0
:在指数0
从{0, 1, 2, 3}
删除项目给予{1, 2, 3}
。第二次迭代与
y = 1
:在指数1
从{1, 2, 3}
删除项目给予{1, 3}
第三次迭代与
y = 2
:在指数2
从{1, 3}
删除项目给出。糟糕,索引2处没有项=>例外。
所以,你应该向后遍历这样的:
for(int y = countMutable-1; y >= 0; y--) {
[bookListMutable removeAtIndex:y]];
}
或方法使用的生成:
[bookListMutable removeAllObjects];
谢谢你非常清楚的解释=) – 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)
谢谢你,现在它工作。 – 2012-02-19 21:09:05
我发现很多可能与代码有关的错误,但最糟糕的是:您正在从索引0开始删除数组中的对象,继续计数。这将意味着i = 0,1,2,3,而数组继续将元素移回到位置0.这肯定会抛出异常,并且只能以这种方式擦除数组的一半。
替代方案:使用清除阵列([bookListMutable removeAllObjects]
)的方法,或者从迭代计数下降到0
1)时间更新,有一个Xcode 4.3。 2)SIGABRT通常是一个例外。你检查了控制台吗? – 2012-02-19 20:44:52
这是哪一行?另外,为什么不使用'removeObjectAtIndex:',或者'removeAllObjects' ?! – 2012-02-19 20:45:59
我试图从这本书做练习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