есть ли причина использовать свойство для ivar, которое используется только внутри класса?

Есть ли причина использовать свойство для ivar, которое используется только внутри класса?

Я вижу, что использование свойств в target-c для класса помогает другим классам получать доступ к переменным экземпляра, однако только для внутреннего использования переменной экземпляра есть ли какая-либо выгода/необходимость использовать для нее свойство? На самом деле для собственности вы должны быть «я». перед тем, как получить к нему доступ, кажется, а не просто имя переменной экземпляра.

Возможно, мне следует разбить этот вопрос на:

  • например переменные, которые представляют элементы управления IBOutlet (в случае, если это специально)
  • любая другая переменная экземпляра, которая может вам понадобиться в методах класса, чтобы помочь

person Greg    schedule 04.04.2011    source источник


Ответы (2)


Конечно. Если вам нужно изменить значение этой переменной в моменты, отличные от -init и -dealloc, использование @property означает, что вы можете позволить компилятору управлять памятью за вас.

person Dave DeLong    schedule 04.04.2011
comment
Привет, Дэйв - не совсем понял, что вы имели в виду - вам все еще нужно освобождать свойства в методе Dealloc, который я предполагал? - person Greg; 04.04.2011
comment
Я бы предложил добавить любые такие @property в расширение класса. - person Richard; 04.04.2011
comment
@ Грег, да, тебе все равно нужно -release в -dealloc (как обычно). Но внутренне вы сможете выполнять [self setFoo:newFoo];, и все управление памятью, связанное с выпуском старого значения и сохранением нового значения, будет выполняться за вас. Это очень очень полезно. Предложение @Richard поместить объявление в расширение класса - отличное. - person Dave DeLong; 04.04.2011
comment
+1 (+10, если бы я мог). Инкапсуляция управления памятью имеет решающее значение. Альтернативой является разбрасывание его повсюду, по всему коду, что превращает отладку в кошмар, когда (а не в том случае) вы забыли где-то обязательное сохранение или выпуск. Однако использование синтаксиса @property и точки несколько случайно; здесь важно использование методов установки, а не средства их создания. Ручные методы установки будут иметь такое же преимущество в отношении инкапсуляции. - person Sherm Pendley; 05.04.2011
comment
ок, спасибо - немного позор, что вы должны ввести себя. прежде чем использовать свойство - или есть ли + ve вращение, которое мне не хватает? - person Greg; 05.04.2011
comment
@Greg, если вы пропустите self., то вы просто напрямую получите доступ к ivar, что полностью минует установщик свойств. Если хотите, вы можете сделать [self setFoo:newFoo]; вместо self.foo = newFoo;. - person Dave DeLong; 05.04.2011

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

Что касается любой другой переменной экземпляра, единственная причина использования свойств — упростить управление памятью:

self.object = newObject;

заменяет

[object release];
object = [newObject retain];

Если вы не собираетесь использовать свое свойство вне класса, вы можете объявить его в своем .m-файле так же, как вы это делаете с закрытыми методами. Таким образом, другие классы не будут знать о существовании вашего свойства.

person Erik B    schedule 04.04.2011
comment
... и вот почему средства доступа так важны. Слишком легко забыть такие вещи, когда мы пишем их от руки! :-) - person Sherm Pendley; 05.04.2011
comment
@ Sherm Я этого не осознавал, но я доказывал свою точку зрения, не так ли? :) - person Erik B; 05.04.2011