2011-02-02 3 views
0

Вот код, который генерирует исключение из-за некоторых управления памятью я делаю:Добавление autoreleased объекта NSMutableArray

Мой Заголовочный файл:

@property(nonatomic, retain) NSMutableArray *holderArray; 

Мой файл реализации:

@synthesize holderArray 

-(void) viewDidLoad{ 
    holderArray = [[NSMutableArray alloc] init]; 
    [self addSampleObject]; 
} 

-(void) addSampleObject{ 
    [holderArray addObject:[self createSampleObject]]; 
} 

-(ModelObject *) createSampleObject{ 
    ModelObject *mObj = [[ModelObject alloc] init]; 
    // Set a few properties 
    return [mObj autorelease]; 
} 

Что должно происходить в этом контексте? createSampleObject автореализует объект в какой-то момент, а [holderArray addObject] увеличивает счетчик ссылок для этого объекта на 1. Из того, что я понимаю, все должно быть хорошо.

Но когда геттер обращается к этому элементу, я получаю следующее исключение. Она исчезает, если я удалю autorelease STMT при создании модели объекта -

#0 0x012525a8 in objc_exception_throw() 
#1 0x010f36e5 in -[__NSArrayM objectAtIndex:]() 

я упускаю нечто фундаментальное о том, как autorelease работает?

Thanks,
Teja.

EDIT: На самом деле вы правы, есть совершенно несвязанная часть моего кода, которая бросала эту ошибку. Я думал, что единственное, что я изменил с рабочего, - это добавить заявление autorelease.

Спасибо!

ответ

2

Я думаю, что ваша ошибка может быть в getter - это больше похоже на проблему с ограничениями из-за границ, чем с управлением памятью.

Ваше понимание управления памятью кажется правильным, единственное, что я хотел бы отметить, это то, что использование слова «create» в методе предполагает, что возвращаемый объект не автореализован. Не знаю, как выглядят ваши фактические имена методов, я знаю, что это всего лишь образец кода.

1

Автореализованные объекты, как ожидается, будут оставаться доступными до конца функции, в которой они автореализованы. Рассмотрим следующий код:

-(ModelObject *) createSampleObject{ 
    ModelObject *mObj = [[ModelObject alloc] init]; 
    //Set a few properties 
    return [mObj autorelease]; 
} 

Вы могли бы сделать это с теми же результатами:

-(ModelObject *) createSampleObject{ 
    ModelObject *mObj = [[[ModelObject alloc] init] autorelease]; 
    // Set a few properties 
    return mObj; 
} 

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

Смежные вопросы