我正在学习Objecive-C并尝试在循环中删除Object方法。 它无法正常工作。我记得“线程1:程序接收信号:”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
答案 0 :(得分: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 )
答案 1 :(得分:1)
我看到你的代码可能出现了很多问题,但看起来最糟糕的事情是:你要从索引0开始删除数组中的对象,直到计数。这意味着i = 0,1,2,3,而数组继续将元素移回位置0.这肯定会引发异常,只有一半的数组可以这样擦除。
替代方法:使用清除数组的方法([bookListMutable removeAllObjects]
),或从计数向下迭代到0。
答案 2 :(得分:0)
您不应该按该顺序删除项目。假设数组有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 =&gt;没有项目异常。
所以你应该这样倒退:
for(int y = countMutable-1; y >= 0; y--) {
[bookListMutable removeAtIndex:y]];
}
或使用build in方法:
[bookListMutable removeAllObjects];