我试图将NSCoding的方法从实际的类中分离到单独的文件中。我知道您通常可以使用Objective中的类别来定义新方法,但似乎Xcode在没有遇到主类文件中的-encodeWithCoder:和-initWithCoder:方法时仍然会发送警告。
我这么做的原因(希望这听起来不太复杂)是因为我有几十个类分布在不同的文件中,为了避免编写encodeWithCoder:/initWithCoder:方法的冗长和冗余,我编写了一个小脚本来自动解析头文件,根据变量类型生成必要的编码/解码代码,并将结果转储到单个Encoders.m中。结果链接正确,但是在编译“类'MyClass‘的不完全实现”、“’-initWithCoder的方法定义:‘not”(等等)和"Class’MyClass‘没有完全实现'NSCoding’协议“时,我仍然收到警告。我尝试过简单地将声明添加到类的.h文件中,但没有成功。
有没有任何方法告诉Xcode这些方法实际上已经实现了,只是没有在非类别类文件中实现?
一个简化的例子:
MyClass.h
@interface MyClass : NSObject <NSCoding> {
int num; //@ENCODABLE
float timer; //@ENCODABLE
SomeOtherClass *obj; //@ENCODABLE
}
...
@endMyClass.m
#import "MyClass.h"
@implementation MyClass
...
@endEncoders.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发布于 2011-08-27 17:07:38
在类的接口、类扩展或接口或扩展指定的协议中声明的任何方法都必须在主@implementation块中实现,否则将收到警告。没有办法在这些地方声明一个方法,并告诉编译器它将属于一个类别。您可以做的是创建一个类别接口并在其中声明NSCoding协议。如果将此接口添加到主头文件中,任何导入标头的文件都会知道类支持编码,但编译器不会抱怨这些方法没有实现。
新MyClass.m
@interface MyClass : NSObject {
int num; //@ENCODABLE
float timer; //@ENCODABLE
SomeOtherClass *obj; //@ENCODABLE
}
...
@end
@interface MyClass (Encoding) <NSCoding>
@endhttps://stackoverflow.com/questions/7215854
复制相似问题