Добавление объекта в NSMutableArray, вызывающее сбой - PullRequest
0 голосов
/ 06 ноября 2011

Я создаю приложение, которое начинается с CGRect размером с экран. когда пользователь касается CGRect, он разделяется на два CGRect. Я прекрасно работаю, когда касаюсь созданного нового CGRect, но когда я касаюсь не самого последнего CGRect, добавленного в rectangleArray, приложение вылетает и говорит:

Вот код в штрихах Начал, 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 ]

1 голос
/ 06 ноября 2011

Вы пытаетесь изменить массив (с помощью «replaceObjectAtIndex:») при его перечислении («цикл for» в начале вашего кода). Это поднимает исключение. Вы должны увидеть это в журнале консоли, примерно так:

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

Вместо этого вы можете сначала перечислить, затем идентифицировать объекты, которые вы хотите изменить, сохранить их в другом классе коллекции (NSSet или другом NSArray) и, наконец, применить собранные элементы в исходном массиве. Или еще одна возможность - сделать копию первого массива, затем перечислить копию и внести изменения в исходный массив.

0 голосов
/ 06 ноября 2011

У меня была эта проблема раньше в моем коде, и позвольте мне догадаться, вы создали массив в вашем методе init или initWith...., верно?

Чтобы правильно создать свойство с кодом (то есть не элементом управления пользовательского интерфейса из Интерфейсного Разработчика) в методе init, всегда сохранит ваше свойство.

Короче говоря,

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

должно быть

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

Таким образом, даже если ваш init метод завершится, оставшееся количество myNSMutableArray не позволит системе освободить / освободить ваш объект.

В качестве альтернативы, поскольку вы объявляете свойство (сохраняете), вы можете использовать

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

Использование аксессора сохранит вас.

...