【问题标题】:Objective C - How do I use initWithCoder method?Objective C - 我如何使用 initWithCoder 方法?
【发布时间】:2014-01-18 04:28:16
【问题描述】:

我的类有以下方法,它打算加载一个 nib 文件并实例化对象:

- (id)initWithCoder:(NSCoder*)aDecoder 
{
    if(self = [super initWithCoder:aDecoder]) {
        // Do something
    }
    return self;
}

如何实例化这个类的一个对象? 这是什么NSCoder?如何创建它?

    MyClass *class = [[MyClass alloc] initWithCoder:aCoder];

【问题讨论】:

    标签: objective-c cocoa-touch nscoder


    【解决方案1】:

    你还需要定义如下方法:

    - (void)encodeWithCoder:(NSCoder *)enCoder {
        [super encodeWithCoder:enCoder];
    
        [enCoder encodeObject:instanceVariable forKey:INSTANCEVARIABLE_KEY];
    
        // Similarly for the other instance variables.
        ....
    }
    

    并在initWithCoder方法中初始化如下:

    - (id)initWithCoder:(NSCoder *)aDecoder {
    
       if(self = [super initWithCoder:aDecoder]) {
           self.instanceVariable = [aDecoder decodeObjectForKey:INSTANCEVARIABLE_KEY];
    
           // similarly for other instance variables
           ....
       }
    
       return self;
    }
    

    您可以以标准方式初始化对象,即

    CustomObject *customObject = [[CustomObject alloc] init];
    

    【讨论】:

    • 我的主要问题是:“那么基于这个init方法你如何实例化这个类的对象?”
    • 如果您使用对象进行序列化和反序列化,则需要定义这些方法。您可以使用普通的 init 方法初始化对象
    • 但是……如何调用 initWithCoder 方法?
    • 我认为您指的是 [NSKeyedUnarchiver unarchiveObjectWithData:]。查看 NSKeyedUnarchiver 读取数据的类方法
    • @Ev 你没有调用 initWithCoder,这个方法被调用作为从 nib 或 storyboard 加载视图的结果。
    【解决方案2】:

    NSCoder 类用于归档/取消归档(编组/解组,序列化/反序列化)对象。

    这是一种在流(如文件、套接字)上写入对象并能够稍后或在不同位置检索它们的方法。

    我建议你阅读http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/Archiving/Archiving.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多