KVO

KVO的实现:

KVO会内部实现一个子类NSKVONotifying_Person这样类,也就是Person对象的isa指向是NSKVONotifying_Person类重写setAge、class、dealloc、_isKVOA函数

查看_NSSet*AndNotify的存在?

问题:直接改变变量值能触发到kvo吗?

per->_age = 26;

这个是不触发kvo的,可以手动willChangeValueForKey:和didChangeValueForKey:

正常的属性是在内部实现了willChangeValueForKey:和didChangeValueForKey:

didChangeValueForKey:内部会调observer的observeValueForKeyPath:ofObject:change:context:函数

 

kvc:

1.通过 setValue:forKey,然后按照顺序要找setKey,_setKey,找到了调用方法。如果没有找到2

2.查看(属性不存在,就寻找变量)accessInstanceVariablesDirect函数的返回值,如果是NO,跳setValue:forUndefinedKey抛异常NSUnknownKeyException。如果是YES 到3

3.按照_key、_isKey、key、isKey顺序找,找到就直接赋值,否则就是跳setValue:forUndefinedKey抛异常NSUnknownKeyException

比如上面代码 调用[per setValue:@1 forKey:@”height”] 会优先调_height、_isHeight、height、isHeight

  • valueForKey:getKey、key、isKey、_key顺序查找 其他和12一样

发表回复

电子邮件地址不会被公开。 必填项已用*标注

Protected with IP Blacklist CloudIP Blacklist Cloud