如果你告诉一个目标c对象removeObservers:对于一个关键路径并且该关键路径尚未注册,它会破坏sads.喜欢 -
'无法删除关键路径"theKeyPath"的观察者,因为它未注册为观察者.
有没有办法确定一个对象是否有一个注册的观察者,所以我可以做到这一点
if (object has observer){
remove observer
}
else{
go on my merry way
}
Run Code Online (Sandbox Code Playgroud) 简而言之,当属性值发生变化时,我必须更新代码中的一些逻辑,例如:
- (void)setProp:(NSString *)theProp
{
if (prop != theProp){
[prop release];
prop = [theProp copy];
[self myLogic];
}
}
Run Code Online (Sandbox Code Playgroud)
要么:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqualToString:@"prop"]){
[self myLogic];
}
}
Run Code Online (Sandbox Code Playgroud)
哪种方式最好,为什么?
编辑:我完全采用第二种方式,因为我不知道编译器会@synthesize为我生成指令,我选择相信编译器比我欠的setter实现更聪明,因此我不会破坏某些东西.
我觉得我不完全理解KVO和NSNotification之间的区别......它们似乎是如此相似......你能举一些例子说明何时最好使用一种方法而另一种方法?
我不是说Bind和IB,但我的意思是在我的代码中使用NSNotificationCenter或KVO以编程方式添加Observer
[self.preferenceController addObserver:self
forKeyPath:@"color"
options:NSKeyValueObservingOptionOld
context:@"Color-change"
];
Run Code Online (Sandbox Code Playgroud) cocoa objective-c key-value-observing nsnotificationcenter swift