观察与其类型同名的属性时,奇怪的KVO keyPath命名约定?

时间:2017-06-08 09:17:51

标签: objective-c key-value-observing

我在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上找到任何引用,所以我想知道这是一个错误还是一个功能,因为类型和名称之间可能存在“冲突”?

0 个答案:

没有答案