2012-07-26 3 views
-1

오랫동안 읽었을 때 죄송합니다. 이것은 제가 혼란스러워하는 책의 일부입니다.ivars 명명 규칙 및 @ 합성물

(엑스 코드 (4)가 채용 된) 코딩 컨벤션의 현재 추세 인스턴스 변수 이름 주인공 등 밑줄 (_)을 사용 이다. 따라서 템플릿 코드 에서 Xcode가 _로 시작하는 변수로 생성 한 참조는 인스턴스 변수를 직접 이름으로 참조합니다. @synthesize 지시문을 볼 때

@synthesize window = _window;

하지 _window는 @의 propterty 선언 할 수있는 이유는/window에 할당하는 대신 처음부터 합성?

그것은 창을 명명 된 속성에 대한 getter와 setter를 합성하고 _window (명시 적으로 선언하지 않아도되는)라는 인스턴스 변수와 해당 속성을 연결할 말했다. 이렇게하면 인스턴스 변수와 속성을 구별 할 수 있으며 은 setter 및 getter 메서드를 사용하여 인스턴스 변수 의 값을 설정하고 검색하는 것이 좋습니다. 즉, 과 같은 글을 쓰는 것입니다.

[window makeKeyAndVisible]; // 작동하지 않습니다

window라는 인스턴스 변수가 없으므로 실패합니다. 대신 은 인스턴스 변수의 이름을 직접 이름으로 지정해야합니다 (예 : ).

[_window makeKeyAndVisible];

또는 바람직하게는, 상기 접근 방식을 사용

[self.window makeKeyAndVisible];

self.window은 다른 방법으로 밑줄이 필요하지 않습니까?

답변

0

세터/게터 방법 내에서만 밑줄이있는 입술에 액세스합니다. 이 경우에는 - (UIWindow *)window- (void)setWindow:(UIWindow *)window의 구현 내에있게됩니다. 다른 클래스 구현에 대해서는 합성 된 ivar (self.window)이 아닌 @property을 참조하십시오.내 초기 obj-c 일에 이해하는 데 도움이되는 한 가지 : self.window = ...;[self setWindow:...];과 동의어이므로 규칙을 따라하면 행복 할 것입니다.

Apple의 Objective-C를 내부적으로 구현하면 매우 멋진 메모리 관리가 가능합니다. 당신이 규칙을 지키는 한 당신은 결코 대처할 수 없을 것입니다. 전형적인 애플이지만 작동합니다.

0

구문 self.window은 실제로 메소드를 호출합니다 (실제로 보이지는 않지만). 예를 들어 @synthesize또는이라는 이라면 - (id) window { ... }과 같은 메서드를 정의하면 self.window이 해당 메서드를 호출하고 반환 된 값을 나타냅니다. 마찬가지로 self.window = value;은 암시 적으로 [self setWindow:value]을 호출합니다.

@property 등의 기본 메소드의 이름을 변경할 수 있습니다. getter=을 사용하십시오.