Можно ли назвать release в объекте Objective C?

Недавно я преподавал Objective C и заметил, что следующий шаблон часто используется в учебниках и образце кода (включая образцы с сайта Apple).

UIView *myUiView = [[UIView alloc] init]; self.uiView = myUiView; [myUiView release]; 

Мне просто интересно, хотя для создания новой переменной кажется немного ненужной, просто чтобы установить свойство. Я также видел следующий шаблон, который также использовался, но из того, что я понимаю, его плохая форма для использования autorelease на устройстве iOS, поскольку пул автозаполнения занимает довольно много служебных данных, которые могут быть неэффективны на мобильном устройстве

 self.uiView = [[[UIView alloc] init] autorelease]; 

Недавно я играл с использованием следующего шаблона, который устанавливает свойство, а затем вызывает release в свойстве (чтобы уменьшить счетчик ссылок на самом свойстве).

 self.uiView = [[UIView alloc] init]; [self.uiView release]; 

Мне удалось использовать его на нескольких ViewControllers без каких-либо вредоносных эффектов, но является ли этот допустимый код, или мне не хватает чего-то, что делает его плохой идеей?

Свойство getter – это метод, и ему не нужно возвращать ivar, он может фактически получить его возвращаемое значение в любом месте, поэтому вы можете его освободить, но это может быть уже автореализованное значение. Если это так, у вас проблемы.

IOW, если свойство getter будет делать что-то вроде (не обычное, но возможное и допустимое):

 - (NSString *) helloString { return [[myStringIVar copy] autorelease]; } 

и вы делаете:

 [self.helloString release]; 

то вы потерпели неудачу двумя способами:

  • Вы не выпустили ивара, который хотите выпустить
  • Вы выпускаете автореализованный объект

ИМО, лучше выпустить ivar напрямую:

 [myStringIVar release]; 

Если реализация свойства getter просто возвращает ссылку на базовый ivar, то это совершенно эквивалентно, и вы просто уменьшаете количество удерживаемых объектов.

С другой стороны, если вы не можете быть уверены в том, что делает геттер (что, если он возвращает что-то еще, чем ivar, например, какой-то расчетный результат и т. Д.), Это может быть опасно.

Нет. Это неверно.

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

Свойства – это всего лишь пара методов, одна из которых устанавливает абстрактный объект и тот, который его получает. В целом нет никакой гарантии, что геттер даст вам тот же самый объект, который вы только что передали установщику. Например, если вы передаете изменяемую строку в свойство копирования NSString , вы определенно не получите тот же объект.

Используйте один из первых двух шаблонов. Первый ничего не тратит. Скорее всего, локальная переменная будет существовать только в регистре. Накладные расходы второго будут продолжаться только до тех пор, пока следующий пул автозапуска пуст и будет всего несколько байтов (имейте в виду, что фактический объект будет длиться до тех пор, пока self в любом случае).

Это неверно, и даже в тех случаях, когда он действительно работает, он немного «уродлив», другие два – только для того, чтобы зафиксировать характеристику сохранения свойства, чтобы сделать счетчик сохранения 2 после того, как распределение уже делает счетчик сохранения 1.

Я стараюсь делать то, что вы описали в первом примере или следующем.

в моем @interface

 @property (nonatomic, retain) UIView *uiView; 

в моей @ реализации

 @synthesize uiView = _uiView; 

затем, когда я устанавливаю свойство.

 _uiView = [[UIView alloc] init]; 

Думая о контрольном счетчике, ничего не получается с вызовом release с использованием значения свойства. Однако есть несколько вещей, которые мне (лично) не понравились бы:

Синтаксис свойств – это действительно просто синтаксический сахар для вызовов методов. Итак, как выглядит ваш код,

 [self setUiView: [[UIView alloc] init]]; [[self uiView] release]; 

Другое дело здесь, возможно, в большей степени из-за того, что я думаю странным образом, но мне нравится думать о подсчетах ссылок, как о том, что они связаны со ссылками. Локальная переменная, содержащая указатель на мой объект, является такой ссылкой. Наличие этого кода напоминает мне, что я должен что-то делать, чтобы правильно очистить вещи (или, если нет, хотя бы написать короткий комментарий, почему мне не нужно чистить).

Прямо пройти через свойство заставляет меня думать в терминах ссылок, вместо этого, что мне не нравится.

  • Когда переопределение объективных c-геттеров
  • слабое свойство IBUutlet UIView станет nil
  • Предупреждение при отключении / удалении атрибута 'strong' из свойства?
  • Objective-C @property использование макропараметров
  • Если я создаю полностью настраиваемые методы getter и setter, мне все равно нужно объявление @property?
  • Категория iOS соответствует протоколу со свойствами: как реализовать
  • Разница между @property (nonatomic, readonly) и расширением @property внутри класса?
  • Разница между @property и ivar в Xcode 4.5
  • Является ли современная конвенция Objective-C действительно не иметь никаких иваров, которые не являются свойствами?
  • Невозможно получить доступ к свойству UIColor UIView из UIViewController
  • почему слабый для свойства и __weak, например переменная, ведут себя по-разному
  • Давайте будем гением компьютера.