ldi*_*ual 5 cocoa-touch properties objective-c key-value-observing ios
假设我们有这个CustomButton界面:
@interface CustomButton : UIButton
@property (nonatomic, assign) CGFloat minWidth;
@end
Run Code Online (Sandbox Code Playgroud)
每次minWidth都改变了,我们想CustomButton再次布局.据我所知,我们有两个解决方案:
// In -initWithFrame:
[self addObserver:self forKeyPath:@"minWidth" options:0 context:nil];
// In -observeValueForKeyPath:ofObject:change:context:
[self setNeedsLayout];
Run Code Online (Sandbox Code Playgroud)
minWidth的二传手// In -setMinWidth:
_minWidth = minWidth; // Side note: it's an ARC project
[self setNeedsLayout];
Run Code Online (Sandbox Code Playgroud)
哪一个是正确的解决方案,为什么?
我可以想到三个理由来覆盖setter而不是KVO属性.
除非您明确需要或想要副作用,否则最小阻力(或本例中的开销)的路径是覆盖设定器.KVO不仅涉及对给定属性的绑定,还涉及观察者在绑定期间将处于活动状态的假设.甚至不要让我开始考虑KVO的调试挑战性!臭名昭着的" NSKVODeallocateBreak断点"足以吓跑任何人.
"观察自己"虽然理论上是一个好主意,但要胜过正确而不是超越制定者.KVO在setter之上也是一个额外的(但是最小的)开销量,它只对绑定到其他对象非常有用.此外,如果你把一个类视为一个独立的单元,那么它真的不需要观察它自身的任何属性.Setter精确存在,以便给定的类可以选择对其属性的变化做出反应,甚至拒绝或修改所述更改.
通过观察自己,你现在已经致力于KVO的规则了:即记住以观察者身份移除自己,并实施
-observeValueForKeyPath:ofObject:change:context:.
相对于手头的任务,这是方式太多的工作.你为什么要记得做所有这些?
| 归档时间: |
|
| 查看次数: |
575 次 |
| 最近记录: |