относительно использования неатомных и сохранения собственности - PullRequest
0 голосов
/ 15 февраля 2012

У меня есть NSMutableArray в AppDelegate. Я использую свойство (nonatomic, retain) и снова синтезирую его

в didfinishlaunch, выделяя его с помощью [[nsmutablearray alloc] init] ;

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

Ответы [ 5 ]

4 голосов
/ 15 февраля 2012

Это зависит от того, как вы его назначаете.Если ваше задание относится непосредственно к ивару, как

myProperty = [[NSMutableArray alloc] init];

, то достаточно одного выпуска в dealloc, потому что у вас есть ожидаемое количество подсчетов 1 из alloc.

С другой стороны, если вы использовали синтезированный сеттер через:

[self setMyProperty:[[NSMutableArray alloc] init]];

или

self.myProperty = [[NSMutableArray alloc] init];

, то вы почти наверняка вытекли из объекта.Вы увеличили счет сохранения дважды (один раз с помощью alloc и один раз в установщике) и уменьшили его только один раз (в dealloc).

Лучшим ИМО является использование установщика и пула автоматического выпуска:

self.myProperty = [[[NSMutableArray alloc] init] autorelease];

Здесь alloc сбалансирован с локальным автоматическим выпуском, а сохранение сеттера сбалансировано с выпуском dealloc.

Хотя этот подход включает в себя два дополнительных метода (метод setter и вызов autorelease), он гарантирует, что любые сохраненные значения, которые ранее были установлены в свойстве, были release d по мере необходимости (в методе setter),

0 голосов
/ 15 февраля 2012

В вашем случае количество сохранений будет равно 2, и массив будет освобождаться.Когда вы установили свойство, вам не нужно его инициализировать.

0 голосов
/ 15 февраля 2012

Если вы используете

[self setMutableArray:[[nsmutablearray alloc] init]];

в этом случае он освободит любую память, которая ранее была ему назначена (отказаться от владения). так что в методе dealloc вы просто написание

self.mutableArray = nil; 

тогда он откажется от владельца и память, выделенная для mutableArray, будет освобождена автоматически

0 голосов
/ 15 февраля 2012

Если вы делаете что-то вроде:

my_property = [[NSMutableArray alloc] init];

my_property предполагает владение вашим массивом. Метод dealloc вашего класса должен освободить массив для предотвращения утечек.

[my_property release];

-или-

self.my_property = nil;
0 голосов
/ 15 февраля 2012

Да, вам все еще нужно выпустить его в dealloc.Эти две страницы являются обязательными для чтения для разработчиков iOS / Cocoa относительно управления памятью

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

Ваш конкретный пример см. В разделе на второмссылка под названием «Внедрение dealloc для отказа от владения объектами»

Здесь также приведена ссылка на эту проблему, адресованную переполнению стека: Общие сведения о подсчете ссылок с помощью Cocoa и Objective-C

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