我想我错过了一些基本的东西..。
我用NSCoding实现了一个类,用NSCoding实现了一个子类,但是当我调用子类的initWithCoder时,会得到一个InvalidArgument错误。
@interface Parent: NSObject<NSCoding>;
@implementation Parent
-(id)initWithCoder:(NSCoder *)decoder {
self = [[Parent alloc] init];
return self;
}
@end
@interface Child: Parent<NSCoding>;
@implementation Child
-(id)initWithCoder:(NSCoder *)decoder {
self = [super initWithCoder:decoder]; //self is Parent type here
// self = [[Child alloc] init]; if i do that, no error but no init for the parent'attribute
if(self){
self.childAttribute = [decoder decodeObjectForKey:@"KeyAttribute"]; // invalide argument ==> setChildAttribute doesn't exist.
}
return self;
}我一定忘了一些基本的东西,但我不知道.有谁有主意吗?
谢谢。
发布于 2014-07-07 11:17:05
您正在以错误的方式初始化Parent。当调用-initWithCoder:时,已经分配了该类。记住语法:
id myObj = [[MyClass alloc] initWithArgument:...];因此,假设在未分配的初始化器中设置默认值。
您可以参考ObjectiveC文档来了解应该如何做到这一点。,我强烈建议您检查一下: ObjC编程中的概念.对象初始化。
而且,内存管理指南也可能非常有用。ObjectiveC依赖于您应该注意的几个约定,以避免可能难以跟踪的泄漏。
初始化父级的正确方法是:
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init]; // it's just a subclass of NSObject
if (self) {
// DECODE VARIABLES...
}
return self;
}如果Parent是另一个NSCoding-compliant类的子类,那么[super init]应该被[super initWithCoder:aDecoder]替换;但是在初始化器中,您将self设置为没有由超类-init...方法返回的东西。
您会得到错误,因为当您调用[Child alloc]时,会分配一个Child实例,但是在Parent初始化期间,您返回手动分配的Parent实例,因此您丢失了对Child的原始引用,类不再匹配。
发布于 2014-07-07 11:20:21
父类初始化函数返回的对象可能是原因。您需要继续使用initWithCoder:函数初始化它的父函数。现在,它应该只是返回一个没有NSObject属性的简单childAttribute对象。
如果所有其他东西都正确地连接在一起,它就应该是:
@implementation Parent
-(id)initWithCoder:(NSCoder *)decoder {
self = [super initWithCoder:decoder];
return self;
}
@endhttps://stackoverflow.com/questions/24608500
复制相似问题