Есть ли разница между ivar в интерфейсе класса и созданным объявленным свойством (современная среда выполнения)? - PullRequest
1 голос
/ 14 апреля 2011

В современном времени выполнения. Вы можете объявить свойство без того же имени ivar, уже объявленного в интерфейсе как

@interface MyClass: NSObject
{
     NSString *str2;
}
@property (retain) NSString *str1;
@property (retain) NSString *str2;
@end

И я знаю, это автоматически сгенерирует ивару str1, поскольку в реализации вы можете получить доступ как к self.str1, так и к чисто str1.

Но мой вопрос в том, есть ли разница между str1 и str2?

Если они одинаковы, почему расширение класса (категория без имени) позволяет добавлять новое объявленное свойство, которое также генерирует ivar, но не позволяет добавлять экземпляр ivar в расширение класса? (Я знаю LLVM 2.0 или позже позволяет это, но gcc не делает)

1 Ответ

0 голосов
/ 04 июня 2012

str1 и str2 одинаковы, потому что при использовании @property методы setter и getter генерируются автоматически, но также создается переменная экземпляра с тем же именем, если ранее не существовало переменной для хранения значений.Например, в вашем коде компилятор скажет: «Похоже, мне нужно создать экземпляр класса NSString, потому что программист хочет получить к нему доступ».Но с str2 переменная экземпляра уже создана для хранения данных, поэтому компилятору не нужно ее создавать.

Лично я кодирую, как вы сделали с str1, не объявляя переменную в @ interface.

Надеюсь, это поможет.

Также проверьте это: Какова цель ивара, когда свойство существует?

...