假设我们有这个 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/