首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超级initWIthCoder返回父类型?

超级initWIthCoder返回父类型?
EN

Stack Overflow用户
提问于 2014-07-07 10:30:23
回答 2查看 769关注 0票数 0

我想我错过了一些基本的东西..。

我用NSCoding实现了一个类,用NSCoding实现了一个子类,但是当我调用子类的initWithCoder时,会得到一个InvalidArgument错误。

代码语言:javascript
复制
@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;
}

我一定忘了一些基本的东西,但我不知道.有谁有主意吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-07 11:17:05

您正在以错误的方式初始化Parent。当调用-initWithCoder:时,已经分配了该类。记住语法:

代码语言:javascript
复制
id myObj = [[MyClass alloc] initWithArgument:...];

因此,假设在未分配的初始化器中设置默认值。

您可以参考ObjectiveC文档来了解应该如何做到这一点。,我强烈建议您检查一下: ObjC编程中的概念.对象初始化

而且,内存管理指南也可能非常有用。ObjectiveC依赖于您应该注意的几个约定,以避免可能难以跟踪的泄漏。

初始化父级的正确方法是:

代码语言:javascript
复制
- (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的原始引用,类不再匹配。

票数 1
EN

Stack Overflow用户

发布于 2014-07-07 11:20:21

父类初始化函数返回的对象可能是原因。您需要继续使用initWithCoder:函数初始化它的父函数。现在,它应该只是返回一个没有NSObject属性的简单childAttribute对象。

如果所有其他东西都正确地连接在一起,它就应该是:

代码语言:javascript
复制
@implementation Parent

-(id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:decoder];
    return self;
}
@end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24608500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档