programing

코코아 objective-c 클래스의 변수 앞에 있는 밑줄은 어떻게 작동합니까?

starjava 2023. 4. 12. 21:40
반응형

코코아 objective-c 클래스의 변수 앞에 있는 밑줄은 어떻게 작동합니까?

나는 몇몇 아이폰의 예에서 속성들이 변수 앞에 언더스코어를 사용한 것을 보았다.이게 무슨 뜻인지 아는 사람?아니면 어떻게 작동하나요?

사용하고 있는 인터페이스 파일은 다음과 같습니다.

@interface MissionCell : UITableViewCell {
    Mission *_mission;
    UILabel *_missionName;
}

@property (nonatomic, retain) UILabel *missionName;

- (Mission *)mission;

위의 기능을 정확히 알 수 없지만 미션 이름을 다음과 같이 설정하려고 하면 다음과 같습니다.

aMission.missionName = missionName;

다음과 같은 에러가 표시됩니다.

구조나 결합이 아닌 무언가의 'missionName' 멤버를 요구하는

일 경우알 수 .ivar는 어떤 ivar를 사용하는지 알 수 있습니다.의 「」, 「」, 「」, 「」,synthesize요.

@synthesize missionName = _missionName;

일반적으로 다음과 같습니다.

@synthesize propertyName = _ivarName;

가독성 규약일 뿐 컴파일러에 특별한 영향을 미치는 것은 아닙니다.개인 인스턴스 변수 및 메서드 이름에 사용되는 사용자를 볼 수 있습니다.애플은 실제로 언더스코어를 사용하지 말 것을 권장하고 있다(신중하지 않으면 슈퍼클래스의 무언가를 덮어쓸 수 있다). 하지만 그 충고를 무시한다고 해서 기분 나빠할 필요는 없다.:)

내가 본 유일한 유용한 목적은 위와 같이 지역 변수와 구성원 변수를 구별하는 것이지만, 그것은 필수적인 규약은 아니다..- @property는 @property로 되어 있습니다.@synthesize missionName = _missionName;디서어

밑줄을 사용하는 대신 충돌하지 않는 메서드 내에서 설명 변수 이름만 사용하십시오.서로 경합할 필요가 있는 경우 메서드 내의 변수 이름에는 여러 메서드에서 사용할 수 있는 멤버 변수가 아닌 밑줄이 있어야 합니다.이것이 유용한 유일한 공통 장소는 setter 또는 init 메서드입니다.또한 @synthesize 문을 더욱 간결하게 만듭니다.

-(void)setMyString:(NSString*)_myString
{
    myString = _myString;
}

편집: 최신 자동합성 컴파일러 기능으로 ivar에 언더스코어를 사용합니다(매우 드물지만 자동합성 기능에 맞추기 위해 ivar를 사용해야 합니다).

이것은 실제로 의미가 있는 것은 아닙니다.일부 사람들이 멤버 변수와 지역 변수를 구별하기 위해 사용하는 규칙입니다.

에러에 대해서는 aMission의 타입이 잘못된 것 같습니다.신고서가 뭐죠?

합성 속성의 명명 규칙만을 위한 것입니다.

.m 파일에서 변수를 합성하면 Xcode는 자동으로 _variable intelligence를 제공합니다.

언더스코어를 사용하면 self.member 구문을 사용하지 않고 ivar를 해결할 수 있을 뿐만 아니라 변수가 ivar(밑줄 프리픽스) 또는 member 인수(밑줄 없음)인지 알 수 있기 때문에 코드를 보다 읽기 쉽게 할 수 있습니다.

예:

- (void) displayImage: (UIImage *) image {

    if (image != nil) {
        // Display the passed image...
        [_imageView setImage: image];
    } else {
        // fall back on the default image...
        [_imageView setImage: _image];
    }
}

이것은 self.variableName과 variableName에 대한 질문의 "마스터" 항목인 것 같습니다._variable name(변수명).나를 당황하게 한 것은.h에 다음과 같은 것이 있었다는 것이다.

...
@interface myClass : parentClass {
className *variableName;    // Note lack of _
}

@property (strong, nonatomic) className  *variableName;
...

이로 인해 self.variableName과 _variableName은 .m의 두 가지 다른 변수가 됩니다.내가 필요한 건

...
@interface myClass : parentClass {
className *_variableName;    // Note presence of _
}

@property (strong, nonatomic) className  *variableName;
...

그런 다음 클래스의 .m에서는 self.variableName과 _variableName이 동일합니다.

제가 아직 확실히 이해하지 못하는 것은 왜 많은 예들이 여전히 효과가 있는가 하는 것입니다. 심지어 이것이 어려운 일이지만요.

광선

언더스코어 대신 self.delf 이름을 사용하거나 변수를 합성하여 언더스코어 없이 변수 또는 아웃렛을 사용할 수 있습니다.

다른 답변에서 누락되는 것은 다음을 사용하는 것입니다._variable무심코 타이핑하는 것을 방지하다variable(적절하게 의도된) 속성이 아닌 ivar에 액세스합니다.

컴파일러는 다음 중 하나를 사용하도록 강제합니다.self.variable또는_variable. 밑줄을 사용하면 입력할 수 없습니다.variable프로그래머 오류를 줄입니다.

- (void)fooMethod {

    // ERROR - "Use of undeclared identifier 'foo', did you mean '_foo'?"
    foo = @1;

    // So instead you must specifically choose to use the property or the ivar:

    // Property
    self.foo = @1;

    // Ivar
    _foo = @1;

}

언급URL : https://stackoverflow.com/questions/822487/how-does-an-underscore-in-front-of-a-variable-in-a-cocoa-objective-c-class-work

반응형