2010-06-30 3 views
9

init 또는 dealloc 메서드 내에서 점 표기법을 사용해서는 안되는 언급의 스 니펫을 읽었습니다. 그러나 나는 결코 그 이유를 알 수없는 것 같습니다. 한 게시물은 KVO와 관련이 있다고 언급했지만 더 이상은 아닙니다.Objective-C Dot 구문 및 초기화

@interface MyClass : NSObject { 
    SomeObject *object_; 
} 
@property (nonatomic, retain) SomeObject *object; 
@end 

이 구현은 좋지 않습니까?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     self.object = object; 
    } 

    return self; 
} 
@end 

그러나 이것은 좋은 것입니까?

@implementation MyClass 

@synthesize object = object_; 

- (id)initWithObject:(SomeObject *)object { 
    if (self = [super init]) { 
     object_ = [object retain]; 
    } 

    return self; 
} 
@end 

init 내부에 점 표기법을 사용했을 때의 함정은 무엇입니까?

+0

두 번째 예에서 object_ = [object retain]; – Vladimir

+0

고정, 신속하게 작성된 예제의 문제. ;) – MarkPowell

답변

25

첫째, 점 표기법이 아닙니다. 특별히 사용하지 않아도되는 접근 자입니다.

self.foo = bar; 

는 동일

[self setFoo: bar]; 

이다 그들은 모두 초기화/할당 해제 내부에 찌푸리게.

하위 클래스가 접근자를 무시하고 다른 작업을 수행 할 수 있기 때문에 그 주된 이유는 무엇입니까? 서브 클래스의 액세스 측은 완전하게 초기화 된 객체, 즉 서브 클래스의 init 메소드 내의 모든 코드가 실행 된 것을 전제로하고있을 가능성이 있습니다. 사실 init 메소드가 실행 중일 때는 아무 것도 없습니다. 같이, 서브 클래스의 액세스는, 서브 클래스의 dealloc 메소드 가 아니고, 실행되고있는에 의존 할 가능성이 있습니다. dealloc 메소드가 실행 중일 때 이것은 분명히 거짓입니다.

+0

방금이 응답을 투표 한 사람이 누구에게 설명했는지 설명해 주시겠습니까? – JeremyP

1

내가 들었던 이유는 주로 자신이 세터/게터를 쓸 때 발생합니다. 메서드의 기본 @synthesized 버전을 사용하면 많은 문제가 발생하지 않습니다. 자신의 세터를 쓸 때 일반적으로 클래스에 부작용이있을 것입니다. 이 부작용은 init에서 필요하지 않거나 아직 생성되지 않은 다른 ivars를 참조하는 경우 문제를 일으킬 수 있습니다. dealloc과 같은 문제는, 부작용이 있다면, 폭파 가능성이 있습니다.