2011-08-27 7 views
3

NSCoding에 대한 메소드를 실제 클래스에서 개별 파일로 분리하려고합니다. Objective-C에서 카테고리를 사용하여 일반적으로 새 메서드를 정의 할 수 있지만 마스터 클래스 파일에서 -encodeWithCoder : 및 -initWithCoder : 메서드를 발견하지 못하면 Xcode에서 경고를 보냅니다.objc 프로토콜 메소드를 메인 클래스에서 별도의 .m 파일로 구현 하시겠습니까?

내가 이것을하고있는 이유는 (그리고 잘하면 너무 복잡하게 들리지 않는다.) 나는 다양한 파일에 걸쳐 여러 클래스가 퍼져 있기 때문에 지루함과 중복을 피하기 위해 encodeWithCoder :/initWithCoder : 각각의 모든 클래스에 대한 메소드, 헤더 파일을 자동으로 구문 분석하고 변수 유형을 기반으로 필요한 인코딩/디코딩 코드를 생성하고 결과를 단일 Encoders.m에 덤핑하는 작은 스크립트를 작성했습니다. 결과 링크가 제대로되었지만 컴파일하는 동안 "클래스 'MyClass'의 불완전한 구현, '-initWithCoder :'에 대한 메서드 정의 : '찾을 수 없음'(등) 및"클래스 'MyClass' 'NSCoding'프로토콜 ". 나는 단순히 클래스의 .h 파일에 선언을 추가하려했지만 시도하지 않았다.

Xcode에 메소드가 실제로 구현되었는지, 카테고리가 아닌 클래스 파일에만 알릴 수있는 방법이 있습니까?

단순화 예 :

에서 MyClass.h

@interface MyClass : NSObject <NSCoding> { 
    int num;    //@ENCODABLE 
    float timer;   //@ENCODABLE 
    SomeOtherClass *obj; //@ENCODABLE 
} 
... 
@end 

MyClass.m

#import "MyClass.h" 
@implementation MyClass 
... 
@end 

Encoders.m

답변

3

클래스의 인터페이스, 클래스 확장 또는 인터페이스 또는 확장이 지정하는 프로토콜에서 선언 된 모든 메서드는 @implementation 블록에 구현되어야합니다. 그렇지 않으면 경고가 표시됩니다. 이러한 장소에서 메소드를 선언하고 컴파일러에게 카테고리에 있다고 알려주는 방법은 없습니다. 당신이 할 수있는 일은 카테고리 인터페이스를 만들고 거기에 NSCoding 프로토콜을 선언하는 것입니다. 이 인터페이스를 기본 헤더 파일에 추가하면 헤더를 가져 오는 파일은 클래스가 코딩을 지원한다는 것을 알게되지만 컴파일러는 메소드가 구현되지 않았다는 것에 불평하지 않습니다. 완벽하게 작동

새로운 MyClass.m

@interface MyClass : NSObject { 
    int num;              //@ENCODABLE 
    float timer;          //@ENCODABLE 
    SomeOtherClass *obj;  //@ENCODABLE 
} 
... 
@end 
@interface MyClass (Encoding) <NSCoding> 
@end 
+0

, 감사합니다! – ccjuju

관련 문제