将对象添加到NSMutableArray导致崩溃

时间:2011-11-05 21:59:13

标签: ios crash nsmutablearray sigabrt cgrect

我正在创建一个以CGRect开头的应用程序,它是屏幕的大小。当用户触摸CGRect内部时,它被切割成两个CGRect。当我触摸创建的新CGRect时,我可以正常工作,但是当我触摸一个不是添加到rectangleArray的最新版本的CGRect时,应用程序崩溃并说sigabrt。

以下是touchesBegan中的代码,blockPoint是触摸屏幕的点

for (NSValue *val in rectangleArray){
    CGRect rectangle = [val CGRectValue];
    if (CGRectContainsPoint(rectangle, blockPoint)) {
        CGRect newRectangle;
        CGRect addRectangle;
        if (!inLandscape) {
            newRectangle = CGRectMake(rectangle.origin.x, rectangle.origin.y, rectangle.size.width, blockPoint.y - rectangle.origin.y);
            addRectangle = CGRectMake(rectangle.origin.x, blockPoint.y, rectangle.size.width, rectangle.size.height - (blockPoint.y - rectangle.origin.y));

        }
        else {
            newRectangle = CGRectMake(rectangle.origin.x, rectangle.origin.y, blockPoint.x - rectangle.origin.x, rectangle.size.height);
            addRectangle = CGRectMake(blockPoint.x, rectangle.origin.y, rectangle.size.width - (blockPoint.x - rectangle.origin.x), rectangle.size.height);
        }
        [rectangleArray replaceObjectAtIndex:[rectangleArray indexOfObject:val] withObject:[NSValue valueWithCGRect:newRectangle]];
        [rectangleArray addObject:[NSValue valueWithCGRect:addRectangle]];
    }
}

为什么会崩溃?

2 个答案:

答案 0 :(得分:1)

你试图在枚举时改变数组(使用“replaceObjectAtIndex:”)(代码开头的“for循环”)。这是一个例外。您应该在控制台日志中看到它,如下所示:

Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection  was mutated while being enumerated.

您可以做的是首先枚举,然后识别要变异的对象,将它们存储在另一个集合类(NSSet或另一个NSArray)中,最后将收集的项应用于原始数组中。 或者另一种可能性是你制作第一个数组的副本,然后枚举副本并对原始数组进行更改。

答案 1 :(得分:0)

我之前在我的代码中遇到过这个问题,让我猜,您已经使用initinitWith....方法创建了数组,对吗?

要在init方法中使用代码(即,不是Interface Builder的UI控件)正确创建属性,始终保留您的属性。

简而言之,

myNSMutableArray = [[NSMutableArray alloc] initWith....];

应该是

myNSMutableArray = [[[NSMutableArray alloc] initWith....] retain];
这样,即使您的init方法结束,myNSMutableArray的保留计数也会阻止系统释放/释放您的对象。

或者,由于您以(保留)方式声明属性,因此可以使用

self.myNSMutableArray = [[NSMutableArray alloc] initWith...];

使用访问者将为您保留。