企业介绍微网站怎么做的,网站换空间上怎么办啊,自助建站系统有什么好处,wordpress twenty elevenKVO 的实现原理 KVO是关于runtime机制实现的当某个类的对象属性第一次被观察时#xff0c;系统就会在运行期动态地创建该类的一个派生类#xff0c;在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制如果原类为Person系统就会在运行期动态地创建该类的一个派生类在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制如果原类为Person那么生成的派生类名为NSKVONotifying_Person每个类对象中都有一个isa指针指向当前类当一个类对象的第一次被观察那么系统就会偷偷讲isa指针指向动态生成的派生类从而在给被监控属性复制是执行的是派生类的setter方法键值观察通知依赖于NSObject的两个方法willChangeValueForKey:和didChangeValueForKey:,在一个被观察属性发生改变之前willChangeValueForkey:和didChangeValueForKey:在一个被观察属性发生改变之前willChangeValueForKey:一定会被调用这就会记录旧的值。而当改变发生后didChangeValueForKey:会被调用继而observeValueForKey:ofObject:change:context:也会被调用举例伪代码_NSSet*ValueAndNotify
- (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];
}KVC的实现原理 KVC是Key Value Coding的简称。它是一种可以通过字符串的名字key来访问类属性的机制。而不是通过调用Setter、Getter方法访问。KVC的方法定义在Foundation/NSKeyValueCoding中。KVC使用的基本方法 - (void)setValue:(nullableid)value forKey:(NSString*)key;//通过Key来设值
- (void)setValue:(nullableid)value forKeyPath:(NSString*)keyPath;//通过KeyPath来设值
- (nullableid)valueForKey:(NSString*)key;//直接通过Key来取值
- (nullableid)valueForKeyPath:(NSString*)keyPath;//通过KeyPath来取值 KVC 赋值 setValue:forKey: setValue:forKey:将键字符串key所对应的属性的值设置为value。按照setKey:、_setKey:顺序查找方法如果没有找到Set方法的话将调用方法setValue:ForUndefinedKey:。并抛出异常 NSUnknowKeyException2. 若没有找到Set方法会调用对象的类方法 (BOOL)accessInstanceVariablesDirectly;此方法返回YES时默认返回YES会按照_key_iskeykeyiskey的顺序搜索成员然后赋值。 3. 若都没找到成员变量将调用方法setValue:ForUndefinedKey:。并抛出异常 NSUnknowKeyException KVC 取值值 valueForKey: 按先后顺序搜索getKey:、key、isKey、三个方法若某一个方法被实现取到的即是方法返回的值后面的方法不再运行。如果是BOOL或者Int等值类型 会将其包装成一个NSNumber对象。若这三个方法都没有找到则会调用 (BOOL)accessInstanceVariablesDirectly方法判断是否允许取成员变量的值。若返回NO直接调用- (nullable id)valueForUndefinedKey:(NSString *)key方法并抛出异常 NSUnknowKeyException若返回YES,会按先后顺序取_key、_isKey、 key、isKey成员变量的值。调用- (nullable id)valueForUndefinedKey:(NSString *)key方法。补充 KVC提供属性值正确性验证的API它可以用来检查set的值是否正确、为不正确的值做一个替换值或者拒绝设置新值并返回错误原因。- - (BOOL)validateValue:(inout id __nullable * __nonnull)ioValue forKey:(NSString *)inKey error:(out NSError **)outError; KVC中的异常.获取值时找不到key- (nullable id)valueForUndefinedKey:(NSString *)key;设值时找不到key- (void)setValue:(nullable id)value forUndefinedKey:(NSString *)key给不能设置nil的属性设置了nil。如果你在SetValue方法时面给Value传nil则会调用这个方法(void)setNilValueForKey:(NSString *)key;转载于:https://www.cnblogs.com/ShaoYinling/p/10238492.html