2

为什么不使用常规的@property 而不是瞬态的?我不在乎支持撤消。

4

1 回答 1

3

如果您不需要撤消,那么一个普通的未建模 @property 很有可能会更好。将属性显式建模为瞬态时,主要区别在于:

  • 设置该属性会将对象标记为脏,即使实际上不会保存任何内容;
  • 当对象变为故障时,该属性被清除;
  • 合并更改时可能会发生奇怪的事情,具体取决于您选择的合并策略。

可以在Jakob Stoklund Olesen的https://web.archive.org/web/20160423093331/http://www.2pi.dk/tech/cocoa/transient_properties.html中找到一些研究瞬态建模属性语义的实验. 因为那是一个垂死的archive.org链接,我将摘录一些选择花絮:

  • “一个瞬态属性......您应该将其视为在持久存储中其值为 nil 的东西。

  • “那么瞬态属性有什么用?... [适用于] 任何您不需要存储但想要撤消支持的属性。”

  • “另一个用途……是缓存不能存储的属性。跨存储关系和不支持类型的属性就是典型的例子。在保存之前,将属性转换为可以存储的东西,并将其写入二进制‘影子’属性。”

  • “最好将瞬态属性想象成代表‘在持久存储中为零的东西’,而不是常见的‘带有撤消的花哨的实例变量’。”

一篇好文章,我希望 Jakob 把它留下。

于 2012-01-01T19:15:58.900 回答