필자는 정기적으로 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에서 제외) 사용되어야한다 초기화/할당 해제의 방법, 제외.
이 정보가 맞습니까?
왜'initWithCoder :'에서'self.property' 코드가'_property'가 작동하지 않을 때 작동하는지 알 수 없습니다. 'self.property'가이 프로퍼티의 _setter_를 사용하여 그것을 초기화하는 반면,'_property'는 세터를 우회하지 않고 당신의 프로퍼티에 직접 속한 _instance variable_를 직접 초기화합니다 ... 이상한 점 :/ – nburk
"작동 시키려면"어떤 버그가 발생 했습니까? 원래 ivar 기반 init에는 문제가 없습니다. ivars를 독점적으로 사용하도록 지시 한 코더는 올바르지 않습니다. 그것은 최선의 관행이 아닙니다. ObjC 커뮤니티 내에서 더 많은 불일치가 있었지만, Apple은 마침내 init과 dealloc을 제외한 접근자를 사용해야한다고 문서화했습니다. –
방금 테스트를했는데,'_data'와'self.data'와 함께 작동합니다. 어떤 iOS 버전을 타겟팅하고 있습니까? 훨씬 이전 버전에서는'data' 속성에 대해'_data' 변수를 자동으로 생성하지 않았습니다. – Daniel