Добавление автоматически выпущенного объекта в NSMutableArray - PullRequest
0 голосов
/ 03 февраля 2011

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

Файл моего заголовка:

@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?

Спасибо,Теджа.

РЕДАКТИРОВАТЬ: На самом деле вы правы, есть совершенно не связанный кусок моего кода, который выдает эту ошибку.Я думал, что единственное, что я изменил из рабочего, это добавление оператора autorelease.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

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

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

1 голос
/ 03 февраля 2011

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

-(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;
}

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

...