Почему ивары класса Cocoa-Touch имеют ведущее подчеркивание?

Есть ли какая-то цель у этой конвенции?


person StoneBreaker    schedule 23.08.2010    source источник
comment
Спасибо всем за ответы и обсуждение. Полезный.   -  person StoneBreaker    schedule 23.08.2010


Ответы (2)


Согласно Рекомендации по написанию кода для какао:

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

Имена методов, начинающиеся с подчеркивания, зарезервированы в соответствии с Язык программирования Objective-C (что означает, что они зарезервированы, даже если вы, предположительно, не используете Какао):

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

Кроме того, соглашение C / C ++ гласит, что начальные подчеркивания (часто) зарезервированы для реализации. Многие люди неверно истолковывают это и используют _ для чего-то «личного»; что приводит к увеличению количества вызовов _FooLog () в большой части нашей кодовой базы, даже несмотря на то, что он вызывает неопределенное поведение.

Единственная причина сделать это - препятствовать прямому доступу к ivar в вашем собственном классе. Запретить доступ к ivar из других классов с помощью @private.

person tc.    schedule 23.08.2010

Некоторые разработчики используют следующее соглашение о «сокрытии» ivars следующим способом:

@interface

@private
NSString *_myString
@property (nonatomic, retain) NSString *myString;

@implementation
@synthesize myString = _myString.

при этом запрещается прямой доступ к ivar с принудительным доступом через свойство myString. Это способ скрыть внутреннюю часть вашего класса и соблюдать объектно-ориентированный принцип инкапсуляции.

person ennuikiller    schedule 23.08.2010
comment
Disallow - сильное слово, оно делает визуально очевидным, что вы обращаетесь к iVar, а не к аксессуару. Ничто не мешает пользователю получить доступ к _myString. - person Marcus S. Zarra; 23.08.2010
comment
@Marcus ... кроме обозначения @private! - person ennuikiller; 23.08.2010
comment
Из класса или из других классов? Класс должен знать свои внутренности; другие классы не могут получить доступ к @private ivars. - person tc.; 23.08.2010
comment
очевидно из других классов !! - person ennuikiller; 23.08.2010
comment
кто бы ни оставил отрицательный голос, но достаточно любезен, чтобы объяснить, почему ... кажется довольно капризным ... - person ennuikiller; 23.08.2010
comment
Голос против был моим. Вы также можете вызвать ivar _myString; @private означает, что к нему нельзя получить доступ из других классов, поэтому на самом деле нет смысла использовать зарезервированные Apple имена. - person tc.; 23.08.2010
comment
Голос против - глупый. Объясняемая конвенция очень распространена. Я использую его постоянно, чтобы не было путаницы с myString и self.myString. - person Stefan Arentz; 23.08.2010
comment
Кроме того, ivars с подчеркиванием не являются «Apple Private». Только методы с начальным подчеркиванием. - person Stefan Arentz; 23.08.2010
comment
@ennuikiller Даже с @private он фактически не прекращает доступ к iVar. Фактически, он даже не выдаст предупреждение о внутреннем доступе. Это предложение для внешнего доступа. Не останавливает работу объекта - ›_ myString. - person Marcus S. Zarra; 23.08.2010
comment
@tc Голосование "против" определенно неуместно. Ответ твердый и подчеркивание на iVars раньше зарезервировано Apple, но они отозвали это резервирование, когда был введен @property. - person Marcus S. Zarra; 23.08.2010