Защо иварите от клас Cocoa-Touch имат водещ знак за подчертаване?

Има ли някаква цел тази конвенция?


person StoneBreaker    schedule 23.08.2010    source източник
comment
Благодаря на всички за отговорите и дискусията. полезно.   -  person StoneBreaker    schedule 23.08.2010


Отговори (2)


Apple обича да използва долна черта, за да означава „частен“, според Указания за кодиране за какао:

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

Имената на методите, започващи с долна черта, са запазени според Езикът за програмиране Objective-C (което означава, че те са запазени дори ако не използвате Cocoa, вероятно):

Имената на методи, започващи с „_“, един знак за долна черта, са запазени за използване от 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, а не до accessor. Нищо не спира потребителя да има достъп до _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