[ios]超级 initWIthCoder 返回父类型吗?

标签: ios Objective-C
发布时间: 2017/3/21 23:42:55
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我觉得我失去了一些基本的东西......

我实现了一个具有类 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;
}

一定是忘了一些基本的但我找不出什么... 任何人都有一个想法?

谢谢你。

解决方法 1:

你正在初始化 Parent 用错误的方式。当 -initWithCoder: 是叫,已经分配的类。 请记住语法︰

id myObj = [[MyClass alloc] initWithArgument:...];

所以它假设您不在初始值设定项内分配,您设置了默认值。

你可以参考 ObjectiveC 文档来看看这该怎么做。我强烈推荐这查阅︰概念在陈寿编程 — — 对象初始化
内存管理指南可很有帮助。ObjectiveC 依赖几个公约,你应该知道的避免可能会变得难以跟踪的泄漏。

初始化你父的正确方法是︰

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super init]; // it's just a subclass of NSObject
    if (self) {
        // DECODE VARIABLES...
    }
    return self;
}

如果 Parent 是一个子类的另一种 NSCoding -兼容类, [super init] 应该已被取代 [super initWithCoder:aDecoder] ; 但在任何情况下,在您设置初始值设定项内 self 到尚未归还的超类的东西 -init... 方法。

你得到错误,因为当你呼唤 [Child alloc] ,实例的 Child 分配,但后来在初始化的过程中 Parent 你返回 Parent 手动分配的实例,因此你失去了原始参考 Child 和类不符了。

官方微信
官方QQ群
31647020