【问题标题】:How to implement NSCoding for Properties and ivars automatically如何自动实现属性和 ivars 的 NSCoding
【发布时间】:2015-02-19 17:22:13
【问题描述】:

我正在尝试将大量对象保存到文件中并检索它们以供以后使用。

以前,我使用过these macros - 不过感觉很乏味。

然后我发现了Autocoding,它本身就很棒,但它不能对实例变量进行编码/解码。

我需要自动化整个编码/解码过程,因为我的应用仍在开发中,为每个 ivar 编写编码/解码实现很乏味。

【问题讨论】:

  • 你能用属性代替 ivars 吗?
  • 是的,我可以,但我不能强迫我所有的队友都这样做。希望你能理解我的情况。
  • 这样做会使升级变得困难。如果你的类实现发生变化,你可能不得不编写和维护痛苦的序列化升级方法。
  • 话虽如此,我刚才回答了一个类似的问题:stackoverflow.com/questions/28054122/…
  • @riyaz 你可以尝试说服他们,或者对他们大喊大叫,或者恢复他们使用 ivars 的提交。

标签: ios objective-c iphone xcode nscoding


【解决方案1】:

您可以直接覆盖 +codableProperties 方法并返回 ivars 的名称。它不如自动检测它们好,但比手动编写 NSCoding 逻辑更好。

【讨论】:

  • 这可能是最好的解决方案;完全自动化的方法存在一些真正的缺陷。
  • 感谢您的回答尼克。 :)
【解决方案2】:

您可以从 Objective-C 运行时获取与类关联的 ivars 列表——请参阅class_copyIvarList 函数。同样,您可以使用object_getIvar 获取特定对象的ivar 值,并使用object_setIvar 设置它。这些似乎是您自动编码对象的 ivars 所需的主要工具。

您需要注意的一个地方是,您不想同时保存属性的值和支持它的 ivar 的值。因此,您可能希望将 ivars 列表与属性列表进行比较,并且只对那些似乎没有相应属性的 ivars 进行编码/解码。

此外,使对象状态的最后一点持久化并不总是可取的,因此您应该考虑提供一种选择退出特定 ivars 的方法(最终可能与选择加入一样乏味)。同样,您可能需要确定您甚至 可以 编码哪些 ivars,例如通常的值类型和任何本身实现 NSCoding 的类型。

【讨论】:

  • Here's a good sketch of an implementation(但这并不能解决 Caleb 的所有顾虑)。
  • 谢谢你的线索:)
  • 扩展codableProperties并利用class_copyIvarListobject_getIvarobject_setIvar等解决了我的问题。 // 使对象状态的每一位都持久化并不总是可取的,因此您应该考虑提供一种选择退出特定 ivars 的方法// 我应该找到解决此问题的方法。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
相关资源
最近更新 更多