在注册使用KVO进行更改的回调时,这有效,但会产生编译器警告。
这是一次意外(它是否有效),或者我是否有一些特殊的酱汁用于抑制警告?每个类都有一个全局单例'+'NSObject吗?
[defaults addObserver:[MyClass class] forKeyPath:@"values.SomeValueThatITrack" options:options context:nil];
然后我也在MyClass.m中:
+(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
{
usual blah
}
实际警告字符串: “不兼容的指针类型将'Class'发送到'NSObject *'
类型的参数KVO更改是与全局首选项相关的更改,因此可以由类本身处理,而不是任何单个实例。
答案 0 :(得分:2)
转换observer参数会消除编译器警告:
[defaults addObserver:(id)[MyClass class] forKeyPath:@"values.SomeValueThatITrack" options:options context:nil];
所以看来Class可以响应选择器,但不是NSObject的子类。类方法起作用,因为类可以响应选择器。
我很好奇注册一个Class实例作为观察者是否适用于所有情况,或者KVO是否要求观察者提供NSObject通常提供的其他功能。