Проверка содержимого NSMutableArray - PullRequest
0 голосов
/ 03 июля 2011

Я разрабатываю приложение для iPhone.

У меня есть следующий INIT код:

shapes = [NSMutableArray arrayWithCapacity:numShapes];

После этого я хочу сделать следующее:

- (CGSize) sizeOfShapeType:(ShapeType)type{
    CGSize shapeSize = CGSizeMake(0, 0);
    if (shapes != nil) {
        for(Object2D* obj in shapes)
            if (obj.figure == type) {
                shapeSize = obj.size;
                break;
            }
    }
    return (shapeSize);
}

Но я всегда получаю EXEC_BAD_ACCESS , потому что все фигуры в массиве фигур равны нулю.

Как я могу проверить, является ли Object2D нулевым?

Я получаю исключение здесь:

for(Object2D* obj in shapes)

Ответы [ 3 ]

5 голосов
/ 03 июля 2011

arrayWithCapacity возвращает автоматически освобожденный объект, поэтому вы должны сохранить его, чтобы убедиться, что он не будет освобожден преждевременно:

shapes = [[NSMutableArray alloc] initWithCapacity:numShapes];

или

// .h file
@property (nonatomic, retain) NSMutableArray *shapes;
// .m file
@synthesize shapes;
// your init method
self.shapes = [NSMutableArray arrayWithCapacity:numShapes];

Для последнего решения вам необходимообъявить свойство с атрибутом retain для фигур ivar.

1 голос
/ 03 июля 2011

Причиной получения EXC_BAD_ACCESS, вероятно, является то, что вы не претендуете на владение объектом, назначенным переменной shapes, а не на проблему с NSMutableArray. Я предполагаю, shapes является переменной экземпляра. Ко времени вызова sizeOfShapeType объект, сохраненный в shapes, уже освобожден.

Таким образом, решение состоит в том, чтобы требовать собственности

shapes = [[NSMutableArray arrayWithCapacity:numShapes] retain];
// or
shapes = [[NSMutableArray alloc] initWithCapacity:numShapes];
0 голосов
/ 03 июля 2011
shapes = [NSMutableArray arrayWithCapacity:numShapes];

Вы действительно создали и загрузили массив с объектами Object2D?Приведенная выше инициализация массива инициализирует массив с пространством для numShapes количества указателей на объекты.Но массив все равно будет фактически пустым.Он не создает Object2D объектов для вас.

Приношу извинения за очевидное.Но если это все, что вы делаете в своем коде инициализации, то вы неправильно поняли, что означает arrayWithCapacity:.

...