누군가가 여분의 변수를 만드는 것의 중요성을 설명하고 왜 맨 마지막 줄과 동일한 이름을 가진 새로운 변수 앞에 밑줄을 넣을 수 있습니까?"@synthesize slider = _slider;"를 호출하는 지점이 무엇입니까?
저는 인스턴스 변수를 만드는 것과 관련이 있다고 읽었지만 UI 요소를 인스턴스 변수로 만들고 싶습니다. 유스 케이스를 제공해 줄 수 있습니까?
iOS 개발에 사용하기위한이 객관적인 C 코드.
감사합니다.
누군가가 여분의 변수를 만드는 것의 중요성을 설명하고 왜 맨 마지막 줄과 동일한 이름을 가진 새로운 변수 앞에 밑줄을 넣을 수 있습니까?"@synthesize slider = _slider;"를 호출하는 지점이 무엇입니까?
저는 인스턴스 변수를 만드는 것과 관련이 있다고 읽었지만 UI 요소를 인스턴스 변수로 만들고 싶습니다. 유스 케이스를 제공해 줄 수 있습니까?
iOS 개발에 사용하기위한이 객관적인 C 코드.
감사합니다.
이렇게하는 이유는 인스턴스 변수가 속성 도트 구문에서 명확하게 눈에 띄게하기 위함입니다. 또한 상황에 따라 발생하는 인수 이름에서 인스턴스 변수의 섀도 잉을 피하는 실제적인 효과가 있습니다.
인스턴스 변수를 사용하는 이유는 대개 dealloc에서 KVO 트리거링을 피하기 위해서입니다. 이렇게하면 관측자가 할당 취소 된 객체를 전달하여 EXC_BAD_ACCESS가 발생하는 등의 방식으로 KVO가 실행될 위험이 있습니다.
- (void)dealloc
{
self.slider = nil;
[super dealloc];
}
그래서 대신 속성 액세스를하지 않기 때문에 KVO가 실행되지 않습니다.
- (void)dealloc
{
[_slider release];
[super dealloc];
}
이것은 일반적으로 개인 접두사 또는 접미사 ivar에 속성을 합성하는 데 사용됩니다. 실수로 ivar에 액세스하지 못하도록 방지하고 속성을 사용하지 않고 ivar를 메소드 인수로 덮어 쓰지 않도록합니다.
이 고려 :
@implementation MYClass
@synthesize flag = flag_;
- (void)doSomethingWithFlag:(BOOL)flag {
if (flag) {
// You do not need to worry about confusing the ivar
// flag and the param flag because it is synthesized to flag_
}
}
- (void)doSomething {
if (flag) { // Doesn't work -> use accessor self.flag
...
}
}
@end
당신 @synthesize
속성 그리고 당신은 당신의 자신의 getter 및 setter 메소드 (이 경우 @synthesize
할 필요가 없음) 다음 항상 새로운 인스턴스 변수가 생성이 제공하지 않는 경우 . 기본적으로 속성과 동일한 이름을 가져옵니다. 따라서 @synthesize slider;
은 slider
이라는 이름의 인스턴스 변수를 무대 뒤에서 만듭니다.
self.slider = xxx
을 실제로 사용할 때 실수로 slider = xxx
을 입력 할 수 있습니다. 무언가를 만들 때 최선의 방법은 항상 self.propertyName
(init 및 dealloc 메서드와 사용자 정의 getter 및 setter 메서드 제외)을 통해 액세스해야한다고 말합니다.
이렇게 피하기 위해 @synthesize
문은 뒷받침 ivar의 이름을 해당 속성과 혼동하기 어려운 것으로 변경하는 데 사용됩니다. self.slider
대신 slider
을 사용하면 slider
이 더 이상 인스턴스 변수 이름이 아니기 때문에 컴파일러에서 오류 메시지를 표시합니다.
"물건을 만들 때 모범 사례는 항상 self.propertyName을 통해 액세스해야한다고 말합니다."- 왜이 모범 사례입니까? – Ger
이것이 속성 뒤에있는 점 때문에 항상 접근 자 메서드를 살펴보아야합니다. ivars에 직접 액세스하면 해당 동작을 건너 뜁니다. – Hollance