Нужно ли мне также объявлять свойство в разделе переменных экземпляра?Что я получу? - PullRequest
0 голосов
/ 14 июля 2011

Я прочитал здесь несколько уроков о свойствах, но у меня все еще есть некоторые сомнения, чтобы уточнить, есть ли разница между

@interface MyClass : NSObject {    
}
@property(nonatomic,retain) NSString *temp;
@end

И

@interface MyClass : NSObject {
    NSString *temp;
}
@property(nonatomic,retain) NSString *temp;
@end

Ответы [ 4 ]

0 голосов
/ 14 июля 2011

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

Таким образом, ваш первый пример (который предполагает, что вы используете директиву @synthesize для создания вашего метода получения / установки) автоматически создает ivar, не будет иметь значения, которое вы можете легко получить во время отладки. В конечном итоге вам придется отправлять много NSLog сообщений, а не просто просматривать значения при пошаговом выполнении кода.

Помимо этого, который, по-видимому, относится к этой теме, я обычно добавляю свои ivars к «iv» и изменяю свои настройки цвета в настройках XCode, чтобы никогда не быть уверенным, получаю ли я доступ к свойству или ivar.

Пример

@interface MyClass : NSObject {
    NSString *ivName;
    NSString *ivTitle;
}
@property (nonatomic, copy) NSString *Name;
@property (nonatomic, copy) NSString *Title;
@end

Теперь для этого требуется небольшой трюк (связать их вместе) при синтезе свойств, которые я покажу ниже:

@implementation MyClass
@synthesize Name = ivName;
@synthesize Title = ivTitle;

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

0 голосов
/ 14 июля 2011

Разница в том, что в первой версии компилятор автоматически создает переменную экземпляра (IIRC, она будет называться _temp, но я точно не знаю).Это поддерживается только в iOS и Mac 64 бит.

Во втором примере вы предоставляете переменную.

На самом деле есть способ сообщить компилятору, какую переменную использовать для свойства, котораяЯ использую много:

@interface MyClass : NSObject {
    NSString *temp_;
}
@property(nonatomic,retain) NSString *temp;
@end

@implementation MyClass
@synthesize temp = temp_;
@end

Таким образом, переменная и свойство имеют разные имена, и вы не можете перепутать их (например, забыв префикс self.).

Незначительная сторона-note: часто желательно использовать copy вместо retain для NSString *, так как вы можете назначить NSMutableString * свойству.Теперь, если вы измените эту изменяемую строку, могут произойти неожиданные вещи.

0 голосов
/ 14 июля 2011

В современной среде выполнения (Objective-C 2.0) это то же самое, потому что компилятор сгенерирует переменную для вас. См. Вопрос о @ synthesize

Цитирование языка программирования Objective-C> Объявленные свойства> Директивы реализации свойств :

Существуют различия в поведении синтеза аксессоров, которые зависит от времени выполнения:

  • Для устаревших сред выполнения переменные экземпляра уже должны быть объявлены в блоке @interface текущего класса. Если экземпляр переменная с тем же именем, что и у свойства, существует, и если ее тип совместим с типом свойства, он используется - в противном случае вы получите ошибка компилятора .

  • Для современных сред выполнения переменные экземпляра синтезируются по мере необходимости. Если переменная экземпляра с таким именем уже существует, она используется.

0 голосов
/ 14 июля 2011

Первый вообще работает? Если нет переменной экземпляра, то сложно получить свойство для доступа к нему.

@ свойства предназначены для вас, поэтому вы можете быть ленивыми, они пишут следующие 2 метода для вас (если не установлено только для чтения):

- (void)setYourVariable:(id)new;
- (id)yourVariable;

это также позволяет вам использовать "someClass.itsVariable;" вместо "[someClass itsVariable];"

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

следующим образом:

NSObject *someObject;
NSObject *someOtherObject;

int anInt;
short aShort;
BOOL fakeBool;

вместо:

BOOL fakeBool;
NSObject *someObject;
short aShort;
NSObject *someOtherObject;
int anInt;

Это связано с компилятором, вы можете проверить это с помощью sizeof ()

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