Вызов Release в классе или подклассе? - PullRequest
1 голос
/ 23 июня 2009

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

Ответы [ 5 ]

4 голосов
/ 23 июня 2009

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

После освобождения подкласса он не будет обращаться к свойствам базового класса, технически он больше не существует. Стандартный способ написания dealloc:

- (void)dealloc
{
   // release my stuff, after this line
   // I don't exist and do not need to access any of my properties
   [super dealloc];
}
2 голосов
/ 23 июня 2009

Если свойства используются только подклассом, они должны быть определены в подклассе (не родительском классе), и подкласс должен освободить их в своей функции - (void) dealloc. У вас будет что-то вроде этого:

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

Обратите внимание, что мы не вызываем dealloc для свойств! Мы просто называем «release», что означает, что мы больше не будем их использовать, и система сможет их очистить (при условии, что их никто не использует).

0 голосов
/ 23 июня 2009

Краткий ответ: в базовом классе.

Длинный ответ: объекты "принадлежат" другим объектам. Чтобы владеть объектом, вы должны выделить или сохранить его (с помощью retain, alloc, new или copy). Владелец несет ответственность за утилизацию памяти с выпуском или авто-выпуском. Для каждого размещения / сохранения должен быть один выпуск / авто-релиз.

По соглашению Какао только методы, которые начинаются с "new" и "copy", возвращают объекты, которые были выделены / скопированы / сохранены, но не принадлежат получателю метода. Затем владельцем является объект, который вызвал функцию «new» или «copy».

0 голосов
/ 23 июня 2009

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

Я перефразирую это по памяти из статьи о поэтапно.

0 голосов
/ 23 июня 2009

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

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