ios - 观察属性或覆盖 setter 更好吗?

标签 ios objective-c cocoa-touch properties key-value-observing

假设我们有这个 CustomButton 接口(interface):

@interface CustomButton : UIButton
    @property (nonatomic, assign) CGFloat minWidth;
@end

每次 minWidth 改变时,我们都想重新布局我们的 CustomButton。据我所知,我们有两种解决方案:

观察属性值

// In -initWithFrame:
[self addObserver:self forKeyPath:@"minWidth" options:0 context:nil];

// In -observeValueForKeyPath:ofObject:change:context:
[self setNeedsLayout];

覆盖 minWidth 的 setter

// In -setMinWidth:
_minWidth = minWidth; // Side note: it's an ARC project
[self setNeedsLayout];

哪个是正确的解决方案,为什么?

最佳答案

我可以想到 3 个覆盖 setter 而不是 KVO 属性的理由。

1:副作用可能不同

除非您明确需要或想要副作用,否则阻力最小的路径(或本例中的开销)是覆盖 setter 。 KVO 不仅涉及对给定属性的绑定(bind),而且还假设观察者在整个绑定(bind)期间都处于事件状态。甚至不要让我开始谈论 KVO 的调试是多么具有挑战性!臭名昭著的“NSKVODeallocateBreak 上的断点”足以吓跑任何人。

2:传统智慧

“观察你自己”虽然在理论上是个好主意,但比重写 setter 更难做到正确。 KVO 也是 setter 之上的额外(但最小)开销量,仅对绑定(bind)到其他对象真正有用。此外,如果您将类视为一个独立的单元,那么它确实不需要观察自身的任何属性。 Setter 的存在恰恰是为了让给定的类可以选择对其属性的更改使用react,甚至拒绝或修改所述更改。

3:我们都很懒

通过观察你自己,你现在已经遵守了 KVO 的规则:即记住移除你自己作为观察者的身份,并实现

-observeValueForKeyPath:ofObject:change:context:.

相对于手头的任务,这是方式太多的工作。你为什么要记住做所有这些?

关于ios - 观察属性或覆盖 setter 更好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535614/

相关文章:

javascript - 基于 scroll(function()) 应用 CSS

ios - Watchkit OS 2,WCSession 在后台运行

ios7 UIStatusBar 在 UIViewController 下

cocoa-touch - 如何以编程方式设置 UILabel 的背景颜色?

cocoa-touch - iOS 获取类似 ActionSheet 的按钮

iphone - 如何检测主机设备是iPhone还是iPad?

ios - 加载照片库图像时发生错误 : ERROR: FigCreateCGImageFromJPEG returned -12910. 423114 字节。我们将退回到软件解码

ios - 将 AVPlayerViewController View 添加到外部窗口

android - Trigger.io——Facebook 应用安装跟踪

iphone - 崩溃 : if the file name consists forward slash like "te/st.pdf"