美文网首页
笔记03 KVO & KVC

笔记03 KVO & KVC

作者: PPFSaber | 来源:发表于2021-03-11 21:19 被阅读0次

二 KVO key-value-observe
MJPerson的 instance 对象 添加 kvo 的时候 会动态派生出一个 新的类 类似 NSKOVNotifying_MJPerson 的类 和 一个 NSKOVNotifying_MJPerson meta-class(元类)
instance 对象 的isa 指针 会指向 NSKOVNotifying_MJPerson 对象
NSKOVNotifying_MJPerson class 对象的 isa。指向 NSKOVNotifying_MJPerson meta-class 元类
NSKOVNotifying_MJPerson 是 MJPerson的 子类 会重写 监听 的key 的set 方法 class 方法 dealloc 方法 iskvo方法

类似 下边的情况
@implementation NSKVONotifying_MJPerson

  • (void)setAge:(int)age
    {
    _NSSetIntValueAndNotify();
    }

// 伪代码
void _NSSetIntValueAndNotify()
{
[self willChangeValueForKey:@"age"];
[super setAge:age];
[self didChangeValueForKey:@"age"];
}

  • (void)didChangeValueForKey:(NSString *)key
    {
    // 通知监听器,某某属性值发生了改变
    [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
    }

  • (Class)class
    {
    return [MJPerson class];
    }

  • (void)dealloc
    {
    // 收尾工作
    }

  • (BOOL)_isKVOA
    {
    return YES;
    }

@end

三 KVC

1 直接修改 实例变量的值不会调用 [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];
2 setValue:forKey: 会调用 [oberser observeValueForKeyPath:key ofObject:self change:nil context:nil];

setValue:forKey:
以 [stuedent setValue:@10 forKey:@“age”]; 为例
执行方式是
1 搜索 setAge 、 _setAge
2 如果都没有 则 调用 + (BOOL)accessInstanceVariablesDirectly 如果允许直接访问实例变量 则 依次 搜索 _age、_isAge 、 isAge、age 如果搜索到则赋值(会调用 observeValueForKeyPath)

getValueForKey:
以 [stuedent getValue:ForKey:@“age”]; 为例
1 依次搜索 getAge 、 _getAge、isAge、_isage 有则调用
2 如果都没有 则 调用 + (BOOL)accessInstanceVariablesDirectly 如果允许直接访问实例变量 则 依次 搜索 _age、_isAge 、 isAge、age 如果搜索到则调用.

相关文章

网友评论

      本文标题:笔记03 KVO & KVC

      本文链接:https://www.haomeiwen.com/subject/aaioqltx.html