Отмена выделения NSMutableArray пользовательских объектов - PullRequest
1 голос
/ 17 марта 2010

Мне нужна помощь с освобождением моего NSMutableArray пользовательских объектов. Мне нужно сохранить массив, поэтому я добавил свойство в .h и освобождаю его в dealloc в файле .m. Когда я добавляю объекты в массив, я делаю следующее:

  myarray = [[NSMutableArray alloc] init];
  [myarray addObject:[[mycustomObject alloc]initWithObject:obj1]];
  [myarray addObject:[[mycustomObject alloc]initWithObject:obj2]];

Теперь я не знаю, как выпустить мой пользовательский объект. Если я сделаю следующее:

   [myarray addObject:[[[mycustomObject alloc]initWithObject:obj1] autorelease]];

Я сталкиваюсь с проблемами при доступе к массиву позже. Пожалуйста, совет.

Ответы [ 2 ]

5 голосов
/ 17 марта 2010

Не думаю, что вы понимаете, как работает управление памятью в Какао. Массив сохранит объекты, которые вы добавляете к нему, и сам освободит их, когда массив больше не нуждается в них (например, когда вы освобождаете массив).

Другими словами, добавьте автоматически освобожденный объект в массив и не беспокойтесь о его сохраняемости после этого. Если вы хотите удалить его из массива, просто удалите его (используя removeObjectAtIndex: или что-то похожее). Если вы думаете, что хотите освободить объект, не удаляя его из массива, значит, вы делаете что-то не так, так как это может оставить в вашем массиве свисающий указатель, который позже приведет к сбою.

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

3 голосов
/ 17 марта 2010

Правильный способ сделать это - разрешить массиву владеть пользовательским объектом:

NSMutableArray * array = [[NSMutabelArray alloc] init];

for (id obj in anArrayOfObjects) {
  mycustomObject * customObj = [[mycustomObject alloc] initWithObject:obj];
  [array addObject:customObj];
  [customObj release];
}

Если у вас возникли трудности с доступом к вашему массиву позже, значит, вы что-то не так делаете с управлением памятью массива.

...