2014-06-18 6 views
2

필자는 정기적으로 self.property을 내 Objective C 코드에 사용하는 경향이 있는데, 이는 getter/setter 메서드 (명시 적으로 코딩되거나 자동으로 생성 됨)를 사용한다는 것을 이해하기 때문에 변수에 액세스 할 때입니다.왜 initWithCoder에 self.property가 필요합니까?

또 다른 코더는 코드 전체에 대신 _property을 사용하는 것이 가장 좋습니다. 하지만 제 이해는 _property이 실제로는 init 및 dealloc 메소드에서만 사용된다는 것입니다.

오늘 initWithCoder을 사용하는 일부 코드에서 버그를 발견했습니다. 나는 _property을 initWithCoder 메서드에서 사용하고 self.property으로 변경해야했습니다. NSData 객체를 설정할 때입니다. 여기에 원래 코드 :

@property (nonatomic, strong) NSData *data; 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 
    _data = [decoder decodeObjectForKey:@"data"]; 
    return self; 
} 

는 그리고 나는 그것이 작동하도록하기 위해이로 변경했다 :

@property (nonatomic, strong) NSData *data; 

- (id)initWithCoder:(NSCoder *)decoder { 
    self = [super init]; 
    if (!self) { 
     return nil; 
    } 
    self.data = [decoder decodeObjectForKey:@"data"]; 
    return self; 
} 

내 질문은 - 왜 여기 제외 initWithCoder 입니까? 일반적으로 _property을 init 메소드로 사용하는 것이 가장 좋은 경우, initWithCoder이 다른 이유는 무엇입니까?

일반적인 규칙이처럼 지금 보인다

사용 self.property _property이 (self.property 사용해야 initWithCoder에서 제외) 사용되어야한다 초기화/할당 해제의 방법, 제외.

이 정보가 맞습니까?

+1

왜'initWithCoder :'에서'self.property' 코드가'_property'가 작동하지 않을 때 작동하는지 알 수 없습니다. 'self.property'가이 프로퍼티의 _setter_를 사용하여 그것을 초기화하는 반면,'_property'는 세터를 우회하지 않고 당신의 프로퍼티에 직접 속한 _instance variable_를 직접 초기화합니다 ... 이상한 점 :/ – nburk

+0

"작동 시키려면"어떤 버그가 발생 했습니까? 원래 ivar 기반 init에는 문제가 없습니다. ivars를 독점적으로 사용하도록 지시 한 코더는 올바르지 않습니다. 그것은 최선의 관행이 아닙니다. ObjC 커뮤니티 내에서 더 많은 불일치가 있었지만, Apple은 마침내 init과 dealloc을 제외한 접근자를 사용해야한다고 문서화했습니다. –

+0

방금 ​​테스트를했는데,'_data'와'self.data'와 함께 작동합니다. 어떤 iOS 버전을 타겟팅하고 있습니까? 훨씬 이전 버전에서는'data' 속성에 대해'_data' 변수를 자동으로 생성하지 않았습니다. – Daniel

답변

1

initWithCoder:에 속성을 사용해야한다는 것은 일반적으로 생각하지 않습니다. 나는 코드로 많은 것을 보았고, 힌트로도 도움이 될 수 있다면 ivar 액세스가 initWithCoder:에서 사용되는 곳이 많다.

ARC를 사용하지 않는 경우 구현 설정 _data에 개체가 곧 자동으로 리어 레이팅된다는 문제가 있습니다. 그러나 ARC에서 코드가 정확합니다.

저는 귀하의 경우 다른 문제가 문제의 원인이라고 생각하는 경향이 있습니다. 예를 들어, KVO를 사용하는 경우 속성을 사용해야합니다. 그렇지 않으면 KVO 관련 알림이 생성되지 않습니다. _data에 대한 할당이 문제의 원인이라고 생각하게 한 원인에 대한 자세한 정보와 코드의 다른 부분에 나타나는 문제의 눈에 띄는 영향에 대해 자세히 설명해야합니다.

+0

이상합니다. 앱을 확인한 후 ARC를 사용하고 있습니다. Build Phases의 모든 모듈을 살펴본 결과 아무 것도 ARC가 아닌 것으로 설정되었습니다. 무엇이 나를 _data 사용이라고 생각하게 만들었는지 간단하게 그 줄을 self.data로 바꾸면 앱이 작동하게됩니다. 그렇지 않으면 응용 프로그램은 [NSKeyedUnarchiver unarchiveObjectWithFile : cachePathForKey]; 성명서, 나는 데이터로 무엇인가하려고 할 때. initWithCoder에서는 NSKeyedUnarchiver 문에서 반환 된 후 충돌이 발생하지 않습니다. – Darren

+0

어떤 종류의 충돌이 발생합니까? 콘솔에서 충돌 로그를 게시 할 수 있습니까? 당신이 "추락하다"라고 말할 때 그것이 다음 진술에 도달하지 않는다는 것을 의미합니까? 전체'unarchiveObjectWithFile'은 어떻게 생겼습니까? – sergio

+0

unarchiveObjectWithFile에서 반환 될 때 해제되는 개체에 문제가있는 것 같습니다. MyCachedObject를 사용하여 객체를 만들면 * tmp = [NSKeyedUnarchiver unarchiveObjectWithFile : cachePathForKey]; 그것은 추락한다. 그러나 개체를 할당 한 다음 unarchiveObjectWithFile을 호출하면 다음과 같이됩니다. MyCachedObject * tmp = [[MyCachedObject alloc] init]; tmp = [NSKeyedUnarchiver unarchiveObjectWithFile : cachePathForKey]; 그것은 작동합니다. 전화가 돌아 오면 오브젝트가 유지되지 않는 것 같습니다. – Darren