Должен ли я использовать себя. при выпуске - PullRequest
0 голосов
/ 01 октября 2011

У меня целая куча вещей @property (nonatomic, retain), когда я определяю свои переменные, и я хочу знать:

В моем dealloc методе я должен выпустить их [myGreatVariable release]; или [self.myGreatVariable release];. В настоящее время они сделаны по-прежнему. И насколько это действительно важно? Это просто хорошо, чтобы привыкнуть делать это с этого момента, или я должен вернуться и изменить их все во всех моих классах, потому что вещи фактически не выпускаются.

Ответы [ 3 ]

3 голосов
/ 01 октября 2011

Не используйте [self.myGreatVariable release]. Как отмечает Даниэль, он будет работать в этом контексте, но это самая «убогая» версия, и он сделает неправильную вещь где-нибудь за пределами -dealloc, вероятно оставив ссылку на мусор в свойстве. 1005 *

Вы должны выбрать один из вариантов и стандартизировать либо:

  1. [myGreatVariable release];
  2. self.myGreatVariable = nil;

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

2 голосов
/ 01 октября 2011

Если вы находитесь в dealloc, это не имеет значения, хотя первое немного эффективнее.Но у вас есть 3-й вариант выполнения self.myFairlyGoodVariable = nil;, который полагается на метод setter, чтобы сделать релиз (хотя на два-три младших бита менее эффективно).

Я подозреваю, вы найдете разные аргументы для того,следует сделать.Некоторые люди утверждают, что вы должны использовать переменную экземпляра (sans self.) для всех обращений к чтению.Другие утверждают, что вы должны использовать доступ к свойству (т. Е. С self.) практически везде.Я, как правило, попадаю в последний лагерь, но могу принять аргументы с другой стороны.

Хотя важно быть достаточно последовательным.И если вы работаете с другими, хорошо, если у вас есть для этого «стандарт» команды.

(Одна вещь, которую я хотел бы сделать, это поместить метод dealloc в начало файла .m,vs внизу, где он обычно заканчивается. Таким образом, вы, скорее всего, не забудете обновить метод dealloc при добавлении / изменении свойства и связанного с ним оператора @synthesize.)

1 голос
/ 01 октября 2011

Единственная проблема с использованием «self.variable = nil» в dealloc состоит в том, что он может инициировать дополнительные действия, если вы переопределили «setVariable».Например, некоторые классы будут сигнализировать делегату всякий раз, когда переменная изменяет значения, но вы, вероятно, не хотите делать это, когда находитесь в dealloc.Немного безопаснее использовать «[variable release]».

Надеюсь, ARC скоро все изменится.

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