Когда мне нужно иметь как iVar, так и свойство?

#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.