몇 가지 iPhone 예제에서 속성이 변수 앞에 밑줄 _을 사용했다는 것을 보았습니다. 누구나 이것이 무엇을 의미하는지 알고 있습니까? 아니면 어떻게 작동합니까?
내가 사용하는 인터페이스 파일은 다음과 같습니다.
@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;
답변
가독성을위한 규칙 일 뿐이며 컴파일러에 특별한 작업을 수행하지 않습니다. 사람들이 프라이빗 인스턴스 변수 및 메소드 이름에이를 사용하는 것을 볼 수 있습니다. Apple은 실제로 밑줄을 사용하지 말 것을 권장합니다 (주의하지 않으면 수퍼 클래스에서 무언가를 무시할 수 있습니다). 🙂
답변
내가 본 유일한 유용한 목적은 위에서 언급 한 것처럼 로컬 변수와 멤버 변수를 구별하는 것입니다.하지만 필수 규칙은 아닙니다. @property와 함께 사용하면 합성 문의 상세도가 증가 @synthesize missionName = _missionName;
하고 모든 곳에서 추악합니다.
밑줄을 사용하는 대신 충돌하지 않는 메소드 내에 설명 변수 이름을 사용하십시오. 이들이 충돌 해야하는 경우, 메소드 내의 변수 이름은 여러 메소드가 사용할 수있는 멤버 변수가 아니라 밑줄로 표시되어야합니다 . 이것이 유용한 유일한 장소는 setter 또는 init 메소드입니다. 또한 @synthesize 문을 더 간결하게 만듭니다.
-(void)setMyString:(NSString*)_myString
{
myString = _myString;
}
편집 :
자동 합성의 최신 컴파일러 기능을 사용하여 ivar에 밑줄을 사용합니다 (드문 경우에 자동 합성과 일치하도록 ivar을 사용해야하는 경우가 있습니다).
답변
그것은 실제로 아무것도 의미하지 않으며, 일부 사람들이 지역 변수와 멤버 변수를 구별하기 위해 사용하는 규칙 일뿐입니다.
오류는 aMission의 유형이 잘못된 것 같습니다. 그것의 선언은 무엇입니까?
답변
이것은 합성 속성의 명명 규칙에만 해당됩니다.
.m 파일에서 변수를 합성하면 Xcode가 자동으로 _variable 지능을 제공합니다.
답변
밑줄을 사용하면 self.member 구문 을 사용하지 않고 ivar 을 해결할 수 있을뿐만 아니라 변수가 ivar (밑줄 접두사로 인해)이거나 멤버 인수 (밑줄없이)를 알기 때문에 코드를 더 읽기 쉽게 만듭니다. ).
예:
- (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에 대한 질문의 “마스터”항목 인 것 같습니다. 루프에 나를 던진 것은 .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은 동일합니다.
내가 아직도 분명하지 않은 것은 많은 예제가 여전히 작동하는 이유입니다.
레이
