2010-01-22 11 views
22

가능한 중복 :
How does an underscore in front of a variable in a cocoa objective-c class work?아이폰 바르 명명 규칙

나는 거기 밖으로 표준 물질을 많이, 나는 많은 시간이 변수 것을 볼 것으로 나타났습니다 이 작업이 완료 왜

@synthesize variable = _variable; 

로하는 .m 파일에 synthesize'd @ .H 파일에 _variable 명명하고 있습니까? 내가 뭘 놓치고 있니?

감사합니다.

+0

'_ivar' 대신'ivar_'이 사용 된 것을 보았습니다. 그러나 더 나은 모습을 제외하고는 실제로 그 인자를 사용할 수 없습니다 ... –

답변

21

이. 어떤 사람들은 클래스 변수를 분리하기 위해 명확하게 사용하고 들어오는 매개 변수 이름과의 충돌을 피하기 위해 다른 응답자가 사용하기를 원합니다. Apple 샘플 코드에서도 사용은 혼합되어 있습니다.

1) 어떤 사람들은 _는 "개인"의 좋은 지표라고 생각합니다 :

그러나, 나는 크게 _ 접두사를 사용하여 두 개의 강력한 이유가없는 것을 선호합니다. 제 생각에는 어떤 클래스 로컬 변수도 setter/getter (속성)없이 액세스해야하므로 모든 private입니다. 따라서 autocomplete를 읽고 사용하기 쉽게 이름을 지정하지 않는 이유는 무엇입니까?매개 변수의 이름이 겹쳐지면 컴파일러에서 신속하게 표시하고 매개 변수 (또는 내부 변수)를보다 신중하게 지정하여 피할 수 있습니다.

2) (더 나은 이유가 있습니다.) - 액세스하는 데 사용 된 속성과 동일한 이름의 내부 클래스 var에 대해 XCode에서 "리팩토링"을 사용하는 경우 속성 및 synthesize 문의 이름이 변경됩니다. _이라는 접두어가 붙은 클래스 변수에서 리팩터를 사용하면 속성 이름이 변경되지 않습니다. 내부 이름에 대한 매핑 만 합성하면됩니다. 나는 그 이름이 부동산에서 액세스 할 수있는 실제 변수까지 다양하기를 결코 원하지 않습니다. 이것만으로도 _을 변수 접두사로 사용하고 싶지 않습니다. 이름을 바꿀 수 있다는 것은 코드의 명확성을 높이기 위해 할 수있는 가장 유용한 방법입니다.

+0

메소드 매개 변수 이름 지정에 대한 제안 사항 ivar 이름과 충돌 하는가? initWith * 또는 수동으로 구현 된 속성 설정자의 경우 특히 그렇습니다. 잠시 동안 "a/an"및 "new"접두사를 사용해 보았지만 이름이 복수형 인 경우처럼 항상 편리하지는 않습니다. 필자는 매개 변수에 밑줄 접두사를 사용하려고 시도했으나 Apple 및 dev 커뮤니티 환경 설정으로 인해 ivars와 함께 밑줄을 사용하는 것이 쉽지 않아 코드 판독기를 쉽게 사용할 수 있습니다. 어느 정도까지 이것은 밑줄 접미사에도 적용됩니다. – aleh

+0

요즘 저는 내부 클래스 바스에 대해 "\ _"접두어를 사용합니다. (아는 것과 반대입니다!) 속성과 함께 사용하기 때문에 - 그리고 접두어로 접두사로 _를 사용하여 iVars를 자동으로 만듭니다. Refactor는 속성에서 작동하며 이름이 표시되지 않는 속성을 사용하므로 "\ _"이 중요하지 않습니다. 또한 중복 문제를 제거합니다. 나는이 새로운 대답을 편집하여 어느 시점에서 나의 새로운 생각을 반영 할 것이다. –

+0

알겠습니다. 나는 개인적으로 부동산을 통해 내 자신의 ivars에 액세스하는 것을 주저하고 있습니다 (예 : _ivar/ivar vs self와 같음).ivar) : 공용 쓰기 가능한 속성을 가지고 있거나 읽기 전용 속성을 .m에서 쓰기 가능으로 다시 선언하는 것을 좋아하지 않습니다. 하지만 당신이 말했듯이, 합의가 없습니다. – aleh

1

이것은 순전히 규칙입니다.

[myObject variable] 

는 당신이 실제로 직접 변수에 액세스하는 방법을하지 호출 :이 같은 방법 게터 전화를 걸 때 때문에 나는 그것의 일반적인 가정하자. 앞에있는 _은 변수에 대해 이야기하고 있음을 분명히합니다. 개인적으로, 나는이 구문이 짜증나고 혼란스럽게 느껴진다. 나는 그것이 불필요하다고 느낀다. 그러나 당신이 옳다, 그것은 여기 저기에 나타난다.

4

가끔 사람들이 mVarName (C++)을 사용하고 Obj-c에서 스타일이 _varName 인 것 같습니다. 당신이 가질 수있는 한가지 문제는, 함수에 대한 당신의 인자가 ... set : (int) x -하지만 x라는 iVar를 가지고 있다는 것을 상상해보십시오. 그것의 혼란을 언급하지 않기 위하여.

m, _, 클래스의 멤버 속성이 무엇인지 보여주는 데 도움이됩니다. 이 구문을 사용

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

은 VS

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

바르와 속성이 여러 가지 것을 더 명확하게하는 옵션입니다.

클래스 외부에서 코드를 작성하려면 속성을 사용하므로 차이가 없습니다.

클래스 자체의 구현에 대한 코드의 경우 ivar가 속성과 비교 될 때 명확 해집니다.

@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 

지금은 바르 및 속성에 대해 다른 이름을 사용하여 : : 예를 들어

, 우리는의 NSNumber 객체에 대한 바르/속성을 가지고 있다고 합의에 없다

@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 
1

Apple은 '_'접두어를 사용하지 않기를 선호합니다. Apple은이 접두어를 일관되게 사용하기 때문입니다. 프리픽스를 피함으로써 나는 코코아 터치 클래스를 확장 할 때 내 이바라기가 애플과 충돌하지 않는다는 큰 확신을 갖게됩니다. 우리가 기본 클래스의 소스에 액세스 할 수 없기 때문에 이것은 기존의 개인 ivars의 우발적 인 재사용을 피하기 위해 내가 아는 유일한 방법입니다. 로 시작하는

메소드의 이름과 같은 많은

"_", 하나의 밑줄 문자는 애플에 의해 사용을 위해 예약되어 있습니다.

9

이전 답변에는이 기록의 역사가 누락되었습니다. Objective-C 2.0 이전에는 속성이 없었습니다. 그래서 다음과 같은 인스턴스 변수를 가진 객체를 가질 수 있습니다 :

@interface MyObject: NSObject { 
    NSArray *myArray; 
} 

@end 

그러나 다른 객체에서 어떻게 접근합니까? 해결책은 세터와 게터를 만드는 것이 었습니다. 그러나 혼동을 피하기 위해, 그들은 이런 식으로 할 것 :

@interface MyObject: NSObject { 
    NSArray *_myArray; 
} 

- (NSArray *)myArray; 
- (void)setMyArray:(NSArray *)myArray; 

@end 

__myArray 변수 인스턴스와 방법 -myArray 사이에 혼란을 정리하는 역할을한다.

+0

밑줄없이 ivar 이름을 유지하는 것이 myArray 메소드 이름과 어떻게 혼동 될지 잘 모르겠습니다. 최소한 컴파일러가 아닙니다. 메서드 [obj myArray]를 호출하거나 선택기 @selector (myArray)를 참조하는 것은 항상 ivar (obj-> myArray 또는 단순히 myArray 또는 자체 메서드에서 self-> myArray)를 참조하는 것과 다릅니다. – aleh

+0

클래스의 인스턴스 메소드를 사용할 때 더 유용합니다. 실수로 myArray = @ [@ "A", @ "B", @ "C"]; 대신'myArray = @ [@ "A", @ "B", @ "C"]; '. –

+0

알겠습니다. self.myArray = ...를 의미 할 때 'myArray = ...'를 잘못 입력하는 것이 더 쉽다는 것을 의미하는 것으로 생각됩니다. – aleh

0

내 선호, Google 다음, 밑줄을 추가하고 (나는 재 구현하고있어 경우에도) 명시 적으로 합성하는 것입니다 :

@synthesize varName=varName_; 

내가 볼 경우 그 init..., dealloc의 외부 또는 접근을 강조 뒤, 나는 비린내가있는 것을 안다.