NSCoding 프로토콜에 대한 일반 구현을 만들려고합니다. NSCoding을 구현할 매크로에서 코드가 래핑됩니다.수퍼 클래스에서 선택적 메서드 호출 (Objective-C)
-(void)encodeWithCoder:(NSCoder*)coder;
-(id)initWithCoder:(NSCoder*)coder;
는 initWithCoder 기능의 일반적인 구현은 다음과 같습니다 :
-(id)initWithCoder:(NSCoder*)coder {
if ([super conformsToProtocol:@protocol(NSCoding)])
self = [super initWithCoder:coder];
else {
self = [super init];
}
if (!self) return self;
self = [MyGenericCoder initWithCoder:coder forObject:self withClass:[__clazz class]];
return self;
}
문제가있는 라인은 슈퍼하지 않기 때문에이 컴파일되지 않습니다 self = [super initWithCoder:coder];
인 프로토콜을 구현하기 위해 , 우리는 두 가지 기능을 필요 super가 NSCoding을 구현하지 않는 클래스에서를 사용할 때 initWithCoder:
에 응답하십시오. NSObject<NSCoding>*
으로 super를 캐스팅하면 LLVM 컴파일러에서 작동하지 않습니다.
[super performSelector:(initWithCoder:) withObject:coder]
무한 루프가 발생하는 super == self 이후에는 작동하지 않습니다.
수퍼 클래스에서 함수를 트리거하는 방식으로 [super initWithCoder:coder]
을 호출하고 컴파일 경고/오류를 생성하지 않으려면 어떻게해야합니까?
'컴파일되지 않습니다.'라는 말은 아마 경고를 받는다는 의미일까요? 관련 컴파일러 옵션을 경고가 오류로 처리하도록 설정하지 않았다면 적어도 컴파일해야한다고 생각합니다. LLVM은 super를'(id) '에 캐스트한다면 어떻게 될까? – Tommy