我试图将 NSCoding 的方法从我的实际类中分离到单独的文件中。我知道您通常可以在 Objective-C 中使用 Categories 定义新方法,但似乎 Xcode 在未遇到主类文件中的 -encodeWithCoder: 和 -initWithCoder: 方法时仍会发送警告。
我这样做的原因(希望这听起来不太复杂)是我有许多类分布在各种文件中,并且为了避免写出 encodeWithCoder:/initWithCoder 的乏味和冗余:对于每个类的方法,我编写了一个小脚本来自动解析头文件并根据变量类型生成必要的编码/解码代码,并将结果转储到单个 Encoders.m 中。结果链接正确,但我在编译期间仍然收到警告“类‘MyClass’的不完整实现”、“未找到‘-initWithCoder:’的方法定义”(等)和“类‘MyClass’未完全实现'NSCoding' 协议(protocol)”。我试过简单地将声明添加到类的 .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
编码器.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
最佳答案
在类的接口(interface)、类扩展或接口(interface)或扩展指定的协议(protocol)中声明的任何方法都必须在主 @implementation
block 中实现,否则您将收到警告。没有办法在那些地方声明一个方法并告诉编译器它将在一个类别中。您可以做的是创建一个类别接口(interface)并在那里声明 NSCoding
协议(protocol)。如果将此接口(interface)添加到主头文件,任何导入头文件的文件都会知道该类支持编码,但编译器不会提示未实现这些方法。
新建MyClass.m
@interface MyClass : NSObject {
int num; //@ENCODABLE
float timer; //@ENCODABLE
SomeOtherClass *obj; //@ENCODABLE
}
...
@end
@interface MyClass (Encoding) <NSCoding>
@end
关于objective-c - 在与主类分开的 .m 文件中实现 objc 协议(protocol)方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7215854/