/ / Чи потрібно звільнити об'єкти в NSMutableArray? [дублювати] - iphone, object-c, управління пам'яттю, nsmutablearray

Чи потрібно мені випустити об'єкти в NSMutableArray? [дублікат] - iphone, об'єктив-c, управління пам'яттю, nsmutablearray

Можливі дублікати:
Управління пам'яттю какао NSArray з об'єктами

Я маю NSMutableArray заповнені деякими об'єктами.

Наприклад:

...
id test = [NSObject new];
NSMutableArray *myArray = [NSMutableArray new];
[myArray addObject: test];
...

Коли більш ніж один об'єкт потребує посилання на цей масив, я не можу просто скористатися методом "- removeAllObjects". Тому я використовую лише випуск масиву в моєму методі "- dealloc" моїх власних класів.

- (void)dealloc {
[myArray release];
[super dealloc];
}

Отже, мій об'єкт з назвою "тест" просочився і тому мені потрібно більше робити?

Я не міг знайти відповіді в документації,це не має сенсу для методу "dealloc" або "release" для NSMutableArray. А в посиланні NSObject вони не описують NSMutableArray. Може бути, це де-небудь в "Керівництві з програмування керування пам'яттю" (сподіваюся, що так).

Відповіді:

3 для відповіді № 1

Випускайте тільки те, що ви володієте, будь-то шляхом виділення, нового, збереження або копіювання.

Ви володієте тестом після цього

id test = [NSObject new];

тому ви несете відповідальність за її випуск, незалежно від того, додаєте ви його до масиву чи ні.

Якщо ти зробиш

id test = [[NSObject new] autorelease]; // or any autoreleased convenience methods

ви вже відмовилися від власності на тест, тому ви не повинні випускати його, навіть якщо ви помістіть його в масив або іншу форму колекції. Колекція набуде права власності.

Вам потрібно лише звільнити те, що ви володієте.


5 для відповіді № 2

Контейнери зберігатимуть предмети, що містятьсяі звільнити їх, коли контейнер буде знищений або об'єкти видалені з них. Ви повинні звільнити об'єкти після їх додавання до контейнера (оскільки вони зберігаються контейнером, тому вам більше не потрібно їх зберігати).