Соглашение об именах iPhone ivar

Возможный дубликат:
Как подчеркивается символ подчеркивания перед переменной в classе цели-c cocoa?

Я заметил, что во многих справочных материалах я вижу, что много времени переменные называются _вариантными в файле .h, а затем @ synhesize’d в .m-файле как

@synthesize variable = _variable; 

Почему это делается? Что мне не хватает?

Благодаря!

Об этом не консенсус. Некоторым людям нравится использовать их для ясности для выделения переменных classа, и, как заметил один ответчик, избегать конфликтов с именами входящих параметров. Даже в примере с образцом Apple используется смешанное.

Тем не менее, я очень предпочитаю не использовать префикс и иметь две сильные причины:

1) Некоторые люди считают, что это хороший показатель «частного». Мое мнение состоит в том, что доступ к локальной переменной classа NO не требуется без setter / getter (свойство), и, следовательно, они ВСЕ являются частными – учитывая, почему они не называют их более удобным для чтения и использования автозаполнения? Любое перекрытие имен от параметров быстро обнаруживается компилятором и избегается более продуманным наименованием параметров (или внутренних переменных).

2) (еще лучшая причина) – если вы используете «refactor» в XCode во внутреннем classе var, который называется тем же, что и свойство, используемое для доступа к нему, свойство и оператор синтеза также будут переименованы. Если вы используете refactor для переменной classа с префиксом _ , имя свойства не будет изменено – просто сопоставление синтезов во внутреннем имени. Я почти никогда не хочу, чтобы имя менялось от свойства до реальной переменной, к которой он предоставляет доступ. Это само по себе заставляет меня никогда не использовать _ в качестве префикса переменной, поскольку возможность смены имен – это самая полезная вещь, которую вы можете сделать для улучшения ясности кода.

Использование этого синтаксиса – это возможность сделать более понятным, что ivar и свойство – разные вещи.

Чтобы закодировать внешний class для classа, нет никакой разницы, поскольку он использует свойство.

Для кода в реализации самого classа он может сделать его более понятным, когда ivar используется против свойства.

Например, скажем, у нас есть свойство ivar / для объекта NSNumber:

 @interface MyClass : NSObject { NSNumber *num; } @property (nonatomic, retain) NSNumber *num; - (void)doSomething; @end @implementation MyClass @synthesize num; - (void)doSomething { // set the property, num is properly retained self.num = [NSNumber numberWithInteger:1]; // accidentally set the ivar, num is NOT retained num = [NSNumber numberWithInteger:2]; } @end 

и теперь используя другое имя для ivar и свойства:

 @interface MyClass : NSObject { NSNumber *i_num; } @property (nonatomic, retain) NSNumber *num; - (void)doSomething; @end @implementation MyClass @synthesize num = i_num; - (void)doSomething { // set the property, num is properly retained self.num = [NSNumber numberWithInteger:1]; // compiler error, there is no ivar named "num" num = [NSNumber numberWithInteger:2]; // set the ivar, so it needs to be a retained object i_num = [[NSNumber alloc] initWithInteger:3]; } @end 

В предыдущих ответах отсутствует история, стоящая за этим. До Objective-C 2.0 свойств не было. Таким образом, у вас будет объект с такими переменными экземпляра:

 @interface MyObject: NSObject { NSArray *myArray; } @end 

Но как бы вы обращались к ним с других объектов? решение заключалось в создании сеттеров и геттеров. Но чтобы избежать путаницы, они сделают это так:

 @interface MyObject: NSObject { NSArray *_myArray; } - (NSArray *)myArray; - (void)setMyArray:(NSArray *)myArray; @end 

_ Служит для устранения путаницы между переменной экземпляра _myArray и методом -myArray .

Иногда люди используют mVarName (C ++), а в Obj-c стиль выглядит как _varName. Одна из проблем, которую вы можете иметь, представляет себе, что ваш аргумент функции … set: (int) x – BUT – у вас есть iVar, называемый x … ну, и вы собираетесь заставить компилятор плакать о таких вещах – не говоря о его запутанности.

M, _, что бы ни показывало, какие свойства являются членами classа.

  -(void) set:(int)x { x = x; // x is an ivar! heh } 

В.С.

  -(void) set:(int)x { _x = x; // ahh I see! } 

Это чисто конвенция. Я полагаю, что это обычное дело, потому что когда вы вызываете метод getter, вызывайте так:

 [myObject variable] 

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

Я предпочитаю не использовать префикс ‘_’, потому что Apple использует его последовательно. Избегая префикса, я больше уверен, что мои ивары не сталкиваются с Apple, когда я расширяю class касания cocoa. Поскольку у нас нет доступа к источнику базового classа, это единственный способ узнать, как избежать случайного повторного использования существующих личных иваров.

Так же, как

Имена методов, начинающиеся с символа «_», одного символа подчеркивания, зарезервированы для использования Apple.

Мои предпочтения, следуя Google , – это просто добавить подчеркивание и явно синтезировать (даже если я переопределяю):

 @synthesize varName=varName_; 

Если я вижу, что завершающее подчеркивание вне init... , dealloc или accessor, я знаю что-то подозрительное.

  • Как я могу программно приостановить NSTimer?
  • NULL против нуля в Objective-C
  • Как создать изображение из UILabel?
  • Что мне нужно сделать, чтобы заставить Core Data автоматически переносить модели?
  • NSDateFormatter и yyyy-MM-dd
  • Ошибка сборки Xcode «Неопределенные символы для архитектуры x86_64»
  • Можно ли показать изображение в UIAlertView?
  • Обнаружение iPhone / iPod Touch
  • Изменение позиции UIBarButtonItem в UINavigationBar
  • Воспроизведение музыки в фоновом режиме с помощью AVAudioplayer
  • Ошибка Apple Mach-O Linker при компиляции для устройства
  • Interesting Posts

    Excel – автоматически импортировать данные из ячейки при создании новой вкладки

    MetadataException: невозможно загрузить указанный ресурс метаданных

    Почему Java открывает 3 порта при настройке JMX?

    Нежелательное (неохотное) соответствие регулярному выражению в sed?

    Bluetooth гарнитуры и появляется в звуковых устройствах, но отображается как отключено?

    Настройка Entity Framework для динамической строки подключения

    Загрузите данные из Webservice (asmx) в jqgrid. пожалуйста, помогите мне

    Как я могу получить нагрузку процессора на kernel ​​в C #?

    Что такое встроенные методы в Java и где они должны использоваться?

    Настройка Wifi Router 'Region' – что это влияет? Мощность передачи?

    Почему .NET / C # не оптимизируется для рекурсии хвоста?

    Получение пороговых значений из кривой ROC

    Блоки питания продолжают дуть

    Как создать прозрачную активность на Android?

    Блокировка клавиатуры – Игнорировать ввод, оставить работу мыши

    Давайте будем гением компьютера.