Сбой приложения NSMutableArray

В одном классе я определяю NSMutableArray с геттерами и сеттерами:

@interface ArrayClass : NSObject {
    NSMutableArray *array;
}
@property (nonatomic, strong) NSMutableArray *array;

@end

Затем в файле реализации я alloc init изменяемый массив:

#import "ImageUploader.h"

@implementation ArrayClass
@synthesize array;

- (id)init {
    self = [super init];
    if (self != nil) {
        NSLog(@"ArrayClass inited");
        array = [[NSMutableArray alloc] init];
    }
    return self;
}

@end

Затем я инициализирую экземпляр этого класса из другого класса:

ArrayClass *arrayClass = [[ArrayClass alloc] init];
                [arrayClass.array addObject:image];
                NSUInteger count = [arrayClass.array count];
                NSLog(@"%@", count);

Но когда я пытаюсь добавить объект в изменяемый массив, приложение падает, и Xcode 4.3 показывает: введите описание изображения здесь

Удаление вызова addObject заставляет приложение работать нормально. Что я делаю не так, что может привести к сбою приложения?


person The Kraken    schedule 06.04.2012    source источник


Ответы (6)


Это не правильно:

NSUInteger count = [arrayClass.array count];
NSLog(@"%@", count);

Вы хотите:

NSLog(@"%u", count);

%@ используется для указания того, что аргумент является объектом. Однако NSUInteger — это примитивное значение, а не объект. Вы используете %u для целых чисел без знака.

person Kurt Revis    schedule 06.04.2012

пытаться:

NSLog(@"%i", count);

NSUInteger возвращает INT, а не адрес объекта

person meronix    schedule 06.04.2012

NSLog(@"%@", count); 

неправильно, используйте:

NSLog(@"%i", count); 

%@ в операторе формата ожидает и должен быть объектом, NSUInteger находится в int, а не в объекте.

person zaph    schedule 06.04.2012

Вы используете спецификатор формата %@, предназначенный только для объектов Cocoa, для NSUInteger, который является typedef для обычного unsigned int. Вместо этого используйте %d, %i или %u.

person Rich Tolley    schedule 06.04.2012

Мне кажется, что при попытке напечатать описание происходит сбой, что имеет смысл, потому что вы используете %@, где ожидается целое число в вашем NSLog().

Отдельно использование изменяемого свойства почти всегда является плохой идеей. Если это действительно свойство, вы, вероятно, захотите использовать неизменяемый массив и установить весь массив, когда захотите его изменить.

person Conrad Shultz    schedule 06.04.2012

Согласитесь, что регистрация подсчета неверна, но я думаю, что в других ответах отсутствует очевидный момент: сбой происходит в addObject. Это означает, что изображение равно нулю. NSLog, что перед доп.

person danh    schedule 06.04.2012
comment
На самом деле, NSLog был источником сбоя. Должен был сузить мой вопрос больше. - person The Kraken; 06.04.2012