#iphone #objective-c #ios
#iPhone #objective-c #iOS
Вопрос:
Я вижу, что некоторые примеры иногда объявляют свойство, а также переменную, в других случаях они этого не делают. например, иногда я вижу такой код
@interface Test : NSObject
{
UIProgressView* _progressView;
}
@property (nonatomic,retain)UIProgressView* progressView;
@end
в других случаях я буду сталкиваться
@interface Test : NSObject
@property (nonatomic,retain)UIProgressView* progressView;
@end
Почему, каковы причины? Я учусь и почти всегда использую свойство и переменную.
Я использовал UIProgressView
только в качестве примера.
Комментарии:
1. Не используйте одиночные начальные подчеркивания в именах ivar, если вы не работаете в Apple. Apple делает это так, чтобы их имена не сталкивались с вашими. Используйте что-нибудь еще.
2. Google рекомендует завершать подчеркивание «progressView_». C99 и Apple не рекомендуют использовать начальное подчеркивание «_progressView». Но нередко можно увидеть код, использующий начальное подчеркивание, даже Apple использует его в шаблонах для пользовательских приложений.
3. но все же полезно использовать другое имя ivar для имени свойства?
Ответ №1:
Использование ivars вместо свойств полезно только в том случае, если вы хотите @protected access (доступ только из подклассов) или поддерживаете старую среду выполнения (для которой требовалось и то, и другое).
Ответ №2:
Это зависит от того, синтезируется ли свойство против iVar или выводится каким-либо другим способом (или против другого iVar).
ЕСЛИ у нас есть экземпляр класса, то есть:
Test *myTest = [[Test alloc] init];
Затем в основном объявление свойства
@property (nonatomic,retain)UIProgressView* progressView;
сообщает ли кто-либо, заинтересованный в использовании интерфейса, что они могут получить доступ к следующим двум функциям в экземпляре этого класса:
[myTest progressBar];
[myTest setProgressBar:aProgressBar];
И objective C также позволяет использовать сокращенную нотацию:
myTest.progressBar =
xxx = myTest.progressBar
который делает то же самое.
Необязательно, чтобы эти два метода были реализованы через iVar с тем же именем, что и свойство, или даже через iVar вообще (они могут даже выполнять выборку из базы данных или получать значение).
Если вы @synthesize свойство (что означает, что вы хотите, чтобы прекомпилятор сгенерировал для вас вышеуказанные методы) и явно не указываете iVar в директиве @synthesize , то методы, описанные выше, будут автоматически сгенерированы (благодаря методу synthesize) для установки или получения значения в / изiVar с тем же именем, что и свойство (и реализация будет включать логику сохранения / освобождения в зависимости от директивы property .
Если вы не @synthesize свойство, вы предоставляете свою собственную реализацию, и это может быть все, что вы хотите. Также можно @synthesize свойство, но включить директиву для использования другого iVar в определении метода:
@synthesize progressBar=someOtheriVar;
в этом случае вы также не увидите iVar с тем же именем, что и свойство в заголовочном файле.
Комментарии:
1. 1 за упоминание о том, что свойство может быть не реализовано с использованием ivar.