【问题标题】:Can Custom Setters Break KVO Pattern? Break Retain or Copy Pattern?自定义设置器可以打破 KVO 模式吗?打破保留或复制模式?
【发布时间】:2012-02-03 20:53:59
【问题描述】:

在 Objective-C 中,我想知道自定义 setter 是否会覆盖 KVO 支持(willChangeValueForKey: 和 didChangeValueForKey;),我是否需要在自定义 setter 中明确包含对这些的调用?

保留和复制呢?对于具有 Retain 或 Copy 属性的属性(对于非 ARC 代码),我是否需要在 setter 中明确包含 release 和 retain 或 copy?

【问题讨论】:

    标签: objective-c properties key-value-observing


    【解决方案1】:

    如果您的访问器采用标准格式(-setFoo:-foo),KVO 将自动运行。保留和复制,但是,您需要在自定义访问器中管理自己。

    这是因为保留和复制是合成访问器的一部分,而 KVO 仅基于方法名称。查看here 以获取符合 KVO 的方法命名的完整描述。

    【讨论】:

      【解决方案2】:

      看看Apples Advanced memory management programming,它告诉你如何正确实现自己的getter/setter:

      【讨论】:

        【解决方案3】:

        docs 状态:

        自动支持由 NSObject 提供,默认情况下可用于键值编码的类的所有属性 合规。通常,如果您遵循标准 Cocoa 编码和命名 约定,您可以使用自动更改通知——您没有 编写任何额外的代码。

        如果你有一个 setter,只要遵守命名约定。

        关于复制/保留:

        - (void)setFoo:(id)bar {
          @synchronized (self) { // synchronize if you have to, can be omitted in most cases
            if (bar_ != bar) { // bar_ is the ivar
              [bar_ release]; // omit in ARC
              bar_ = [bar copy]; // resp. retain in other variant
            }
          }
        }
        

        如果您的 setter 不符合规范,请查看“手动更改通知”部分。

        【讨论】:

          猜你喜欢
          • 2012-01-11
          • 1970-01-01
          • 1970-01-01
          • 2018-07-24
          • 2015-02-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多