在主类的单独.m文件中实现objc协议方法?

时间:2011-08-27 16:36:28

标签: objective-c xcode

我正在尝试将NSCoding的方法分离为与实际类不同的文件。我知道您通常可以使用Objective-C中的类别定义新方法,但是当它没有遇到主类文件中的-encodeWithCoder:和-initWithCoder:方法时,Xcode似乎仍然会发出警告。

我这样做的原因(并且希望这听起来并不太复杂)是我在各种文件中分布了许多类,并且为了避免写出的乏味和冗余:encodeWithCoder:/ initWithCoder:对于每个类的方法,我将一个小脚本放在一起,自动解析头文件,并根据变量类型生成必要的编码/解码代码,并将结果转储到单个Encoders.m中。结果链接正确,但我仍然在编译“不完整的类'MyClass'的实现”,“-initWithCoder的方法定义:'未找到”(等),以及“类'MyClass'没有完全实现'NSCoding'协议“。我试过简单地将声明添加到类的.h文件中,但是没有去。

有没有办法通知Xcode这些方法实际上是在实现的,而不是在非Category类文件中?

简化示例:

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

#import "MyClass.h"
@implementation MyClass (Encoding)
-(void) encodeWithCoder:(NSCoder*)encoder {
    // Auto-generated encoding of instance variables
}
-(id) initWithCoder:(NSCoder*)decoder {
    if (self = [self init]) {
        // Auto-generated decoding of instance-variables
    }
    return self;
}
@end

1 个答案:

答案 0 :(得分:3)

在类的接口,类扩展或接口或扩展指定的协议中声明的任何方法都必须在主@implementation块中实现,否则您将收到警告。没有办法在那些地方声明一个方法,并告诉编译器它将在一个类别中。你可以做的是创建一个类别接口并在那里声明NSCoding协议。如果将此接口添加到主头文件中,则导入头的任何文件都将知道该类支持编码,但编译器不会抱怨该方法未实现。

New MyClass.m

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