我正在尝试将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
答案 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