Objective-C奇怪的错误SIGABRT

时间:2012-02-19 20:43:39

标签: objective-c sigabrt

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

3 个答案:

答案 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}并模拟程序的执行:

  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 =&gt;没有项目异常。

  4. 所以你应该这样倒退:

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

    或使用build in方法:

    [bookListMutable removeAllObjects];