Назначение ivars с помощью ключевого слова self в методе init объекта - PullRequest
1 голос
/ 23 ноября 2010

Я читал, что неправильно использовать self.ivar = (удобный метод) в методе объекта и init'е, поскольку это портит наследование.

Однако, если вы знаете, что не собираетесьчтобы создать подкласс для вашего объекта, можно ли использовать назначение ключевого слова self?

i.e. self.iVar = [Object objectConvenienceMethod];

Причина, по которой я спрашиваю, заключается в следующем.Я создаю новый объект с его собственным методом init, и в этом методе я выполняю различные начальные назначения.Поскольку я не использую ключевое слово self, я назначаю их непосредственно iVars и поэтому использую методы alloc, а не вспомогательные методы.Т.е.

iVar = [[Object alloc] init];

Или, если я использую удобный метод, я сохраню его.Т.е.

iVar = [[Object convenienceMethod]retain]

Но ... когда я запускаю свою программу с включенным средством утечки памяти, все эти назначения определяются как утечки памяти.

Если бы я мог использовать ключевое слово self плюс вспомогательный метод вместо alloc-init, тогда это позволило бы избежать проблемы.

Если я решу использовать подход alloc-init, где я должен выпустить iVars ??Просто в dealloc?

Спасибо за помощь :)

Майкл

Ответы [ 3 ]

2 голосов
/ 23 ноября 2010

Нет, поскольку необходимо учитывать не только поведение подкласса - реализации суперкласса и даже поведение кода, сгенерированного платформой (например, синтезированные методы доступа и черная магия, используемая для реализации KVO), также могут вызвать проблемы.Это будет , вероятно, все будет в порядке, но это все еще значительный шанс быть не в порядке.В общем, лучше просто следовать рекомендациям Apple и назначать напрямую.

Назначение ivars в init не должно указываться как утечка в правильно функционирующей программе.Если вы видите это, есть другая проблема, которую вам нужно решить.Попробуйте свести проблему к минимальному случаю, который мы можем попробовать и спросить об этом - тогда мы сможем сказать, что не так.

1 голос
/ 23 ноября 2010

Если вы alloc или retain их в методе init вашего класса, вы должны освободить их в соответствующем методе dealloc.

0 голосов
/ 23 ноября 2010

Я думаю, что ваш "включающий" класс не освобождается, и, следовательно, его метод dealloc не вызывается, в результате чего ваши iVars не выпускаются.

...