Управление памятью для элементов общего массива - PullRequest
0 голосов
/ 09 февраля 2010

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

В классе менеджера есть переменная экземпляра NSMutableArray * mgrArray

Вспомогательный класс имеет переменную экземпляра NSMutableArray * helperArray.

Метод инициализации менеджера:

NSMutableArray* mgrArray = [[[NSMutableArray alloc] init] autorelease];
    for (int i=0; i<10; i++) {
        Food *f = [[[Food alloc] initWithType:@"Fruit"] autorelease];
        [mgrArray addObject:f];
    }

Метод инициализации помощника:

NSMutableArray* helperArray = [[[NSMutableArray alloc] init] autorelease];

Объект manager передает некоторые элементы mgrArray в класс Helper для хранения в целях собственного доступа Helper (скажем, для эффективности). Какой-то метод Manager, который делает это:

Food *e1 = [mgrArray objectAtIndex:3];
Food *e2 = [mgrArray objectAtIndex:5];
Food *e3 = [mgrArray objectAtIndex:7];

[helper. helperArray addObject:e1];
[helper. helperArray addObject:e2];
[helper. helperArray addObject:e3];

Вопрос 1: при добавлении e1 в helperArray, следует ли его скопировать или сохранить или все в порядке, как написано выше?
Вопрос 2: кто должен освобождать память о пищевых объектах и ​​как?

Ответы [ 2 ]

1 голос
/ 09 февраля 2010

Объект будет сохранен при добавлении в массив и освобожден при удалении из массива.

Если вы используете объект с автоматическим выпуском, делать больше нечего.

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

1 голос
/ 09 февраля 2010

Если вы помещаете объект в массив, он сохраняет его.Если вы удаляете объект из массива, массив освобождает его.

Это так просто;владение - сохраняет - всегда должно быть ограничено линиями инкапсуляции.

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

foo = [someArray objectAtIndex: 0];
[someArray removeObjectAtIndex: 0];

В этот момент, foo, возможно, был освобожден.Исправление:

foo = [someArray objectAtIndex: 0];
[foo retain];
[someArray removeObjectAtIndex: 0];
.. do stuff ..
[foo release];

Вопрос 1: при добавлении e1 в helperArray, следует ли его скопировать или сохранить или все в порядке, как написано выше?

Просто добавьте e1 в массив helper.Готово.

Вопрос 2: кто и как должен освобождать память о пищевых объектах?

Когда массив освобождается до точки освобождения, всеобъекты, содержащиеся в массиве, будут освобождены (но не обязательно освобождены, если ничто другое не удерживает).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...