【问题标题】:When do you use encodeWithCoder: and initWithCoder: on the iPhone?你什么时候在 iPhone 上使用 encodeWithCoder: 和 initWithCoder: ?
【发布时间】:2010-10-23 00:21:47
【问题描述】:

正如我在上述主题中提出的问题,您通常需要满足哪些要求才能说“好的,我需要 encodeWithCoder: 和 initWithCoder: 实例化”?通常你可以将对象状态写入NSUserDefaults,所以我很好奇你们专家什么时候决定使用一个与另一个?

【问题讨论】:

    标签: iphone objective-c cocoa-touch initwithcoder


    【解决方案1】:

    initWithCoder: 由操作系统在解压缩 XIB 文件时使用;如果您仔细观察,您会发现 initWithFrame: 不会为您在 XIB 中创建的视图调用;他们将改为调用initWithCoder:。

    【讨论】:

    • 嗨,Ben,当我使用 XIB 时,如果没有这种方法,我也能过得很好。对于我以编程方式构建的视图,我通常只使用 loadView 就可以了。对于我使用 IB 构建的视图,我使用 viewDidLoad{}。所以我试图了解什么时候使用 initWithCoder 有意义:
    【解决方案2】:

    用户默认值基本上是一个属性列表。属性列表类似于 JSON,只能存储特定类型的数据——NSString、NSNumber、NSData、NSDate、NSArray、NSDictionary。如果您尝试在用户默认值中存储任何其他内容,您将收到异常。属性列表也不能处理任意对象图,只能处理树。

    您可以随时获取自定义状态并将其转换为与属性列表兼容的数据结构,然后将其存储在用户默认值中;但是你基本上是在实现一个对象序列化机制,你还不如使用 NSArchiver 已经提供的更强大的机制。

    【讨论】:

      【解决方案3】:

      NSCoder 是实现序列化的标准 Cocoa 方法。有关详细信息,请参阅 Apple 的 Archives and Serializations Programming Guide for Cocoa。

      【讨论】:

        【解决方案4】:

        每当我有某种复杂的数据要存储而我不必手动编辑时,我都会使用 NSCoder。例如,我的应用程序Converter 将从 Internet 下载的货币汇率存储在 NSCoder 存档中。但是,这是它保存在此类存档中的唯一内容:只能手动更改的单位定义保存在应用程序包中的一系列 plist 文件中,最近选择的单位和值等内容保存在NSUserDefaults。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-19
          • 2012-04-23
          • 2018-01-17
          相关资源
          最近更新 更多