我在Obj-C中偶然发现了一个奇怪的行为,当时观察一个名称“匹配”其类型为小写的属性
示例:如果属性被调用foo
且其类型为Foo
,那么要观察的keyPath是不是 @"foo"
,而是@"Foo"
似乎不对。或者是吗?
请注意,我使用了“开箱即用”的KVO和getter / setter以及自动处理KVO事件。
示例代码
foo.h中
#import <Foundation/Foundation.h>
@interface Foo : NSObject
@end
Foo.m
#import "Foo.h"
@implementation Foo
@end
KVOTest.h
#import <Foundation/Foundation.h>
#import "Foo.h"
@interface KVOTest : NSObject
@property Foo *foo;
-(void)test;
@end
KVOTest.m
#import "KVOTest.h"
#import "Foo.h"
@implementation KVOTest
-(void)test {
// this won't work
[self addObserver:self forKeyPath:@"foo" options:0 context:nil];
// this does work
[self addObserver:self forKeyPath:@"Foo" options:0 context:nil];
self.foo = [[Foo alloc] init];
[self removeObserver:self forKeyPath:@"foo"];
[self removeObserver:self forKeyPath:@"Foo"];
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
NSLog(@"keypath: %@", keyPath);
}
@end
的main.m
#import <Foundation/Foundation.h>
#import "KVOTest.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
KVOTest *kvo = [KVOTest new];
[kvo test];
}
return 0;
}
我检查过Apples KVO文档,但没有发现这个案例。
此外,我没有在SO上找到任何引用,所以我想知道这是一个错误还是一个功能,因为类型和名称之间可能存在“冲突”?