Свойства и методы доступа без члена в target-c

Я просто просматривал документацию по свойствам по ссылке: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html В разделе «Вы можете реализовать пользовательские методы доступа» описано, что свойства не всегда должны поддерживаться их собственными переменными экземпляра. В примере fullName также не используется собственный соответствующий член.

Не будет ли компилятор неявно создавать элемент при определении свойства (_propertyName)?


person spd    schedule 26.02.2013    source источник


Ответы (2)


Если вы создаете свойство с помощью @property, то автоматически создается ivar, а его сеттер и геттер создаются компилятором LLVM.

Принимая во внимание, что когда вы создаете ivar, вы должны создать для него сеттер/геттер. Обычно вы делаете с @property и оставляете остальное компилятору.

Однако в некоторых случаях вы создаете ivar и свойство с другим именем и указываете на него как:

@synthesize boxDescription=boxName;

Теперь boxName является аксессором для boxDescription, теперь вы не можете использовать boxDescription в своем коде.

person Anoop Vaidya    schedule 26.02.2013
comment
Спасибо за ответ. Мой вопрос в другом. Предположим, я объявляю @property(nonatomic)NSString *fullName в заголовочном файле и не объявляю никаких членов для fullName. В исходном файле я не пишу synthese fullName и реализую метод доступа fullName { return [NSString stringWithFormat: @myFirstName, @, @myLastName]}. В этом случае компилятор автоматически определит член _fullName? - person spd; 07.03.2013
comment
Если вы используете новый компилятор, только запись @property(nonatomic)NSString *fullName создает для него сеттер/геттер, и по умолчанию он равен _fullName. Таким образом, вы переопределяете, создавая свои средства доступа. - person Anoop Vaidya; 07.03.2013

если вы переопределяете сеттер и геттер по умолчанию и не предоставляете @synthesize (а также не обращаетесь к _ivar), компилятор не создает для вас переменную. в этом случае у вас есть собственность, не обеспеченная иваром.

как очень случайный пример:

@property (nonatomic) int x;

- (int)x
{
  return 1;
}

- (void)setX:(int)x
{
  NSLog(@"%d", x);
}

более полное использование может быть, если у вас есть фасад для других классов, и вы используете этот установщик/получатель для их установки/получения.

если вы не переопределяете set/getter и теперь, когда @synthesize больше не является обязательным по умолчанию, компилятор создает ivar с именем _propertyname, вы можете переопределить это поведение с помощью @synthesize prop_name=ivar_name

person Ultrakorne    schedule 26.02.2013