KVO
1:实现原理
对实例对象属性监听,会利用runtime动态生成一个类NSKVONotifying_Class.并且生成三个方法
1):-(void)Class; 2)isKVO; 3)dealloc;
重写监听的属性方法 –(void)setProperty;
2:监听流程:
调用新生成的类里的set属性方法,然后调用Foundation框架的_NSSetIntValueAndNottify();
这个方法里会调用三个方法
[self willChangeValueForKey:key];
[super setProperty:value]
[self didChangeValueForKey:key];
在didChangeValueForKey里会调用
[observe observeValueForKeyPath:key ofObject:self change:change context:context];
3:验证部分:
1): 调用方法验证
_NSSetIntValueAndNottify()
这个方法会调用的证明过程:
对类的属性监听后,
[self.instance methodForSelector:@selector(setProperty:)]
会返回方法地址,然后利用p (IMP)+方法地址,控制台会输出调用的函数名,就是_NSSetIntValueAndNottify();系列方法;
2):生成方法验证
unsigned int count;
Method*methodList=class_copy MethodList(cls,&count);
NSMutableString*methodNames=[NSMutableString string];
For(int i=0;i<count:i++)
{
Method method = MethodList[I];
NSString*method=NSStringFromSelector(method_getName(thod));
[methodNames appendString:methodName];
[methodNames appendString:@","];
}
free(methodList);
NSLog(@"%@ %@",cls,methodNames);
打印出方法可以看到四个方法,其中有一个是原本类就有set方法.
KVC
1 赋值流程:setValue:forKey:
-
按照setKey: _setKey顺序查找方法,找到则传递参数.
-
找不到则查看accessInstanceVariablesDirectly方法返回值,若是YES则允许访问成员变量,按照_key,_isKey,key,isKey顺序查找成员变量.
-
找到了就直接赋值。找不到就调用setValue:forUndefinekey: 并抛出异常NSUnknownKeyException**
2 取值流程:valueForKey
-
按照getKey、key、isKey、_key顺序查找方法。找到则调用.
-
找不到则查看accessInstanceVariablesDirectiy返回值,若YES则允许访问成员变量,按顺序_key、_isKey、key、isKey查找成员变量,找到直接取值.
-
找不到成员变量则调用valueForUndefinedKey:并抛出异常NSUnknownKeyException
网友评论