当前位置: 首页 > news >正文

哪些行业网站推广做的多南宁网站设计制作公司

哪些行业网站推广做的多,南宁网站设计制作公司,广西柳州网站建设推荐,网站短期就业培训班文章目录 KVC1. KVC赋值原理 setValue:forKey:2. KVC取值原理 valueForKey:3. 注意4. KVC的批量存值和取值 KVO 使用1. KVO的介绍2. KVO监听的步骤注册监听监听实现移除监听例子 3. KVO的传值4. KVO注意5. KVO的使用场景 KVO原理1. KVO的本质是改变了setter方法的调用2. _NSSet… 文章目录 KVC1. KVC赋值原理 setValue:forKey:2. KVC取值原理 valueForKey:3. 注意4. KVC的批量存值和取值 KVO 使用1. KVO的介绍2. KVO监听的步骤注册监听监听实现移除监听例子 3. KVO的传值4. KVO注意5. KVO的使用场景 KVO原理1. KVO的本质是改变了setter方法的调用2. _NSSetXXXValueAndNotify的内部实现原理3. _NSSetObjectValueAndNotify4. 手动调用KVO5. KVO的实现的注意6. KVO类指针交换 KVO总结1. KVO的本质2. KVO实现过程总结 KVO KVC 问题总结3.1 isa混写之后如何调用方法3.2 为什么在生成的子类内部重写class方法3.3 直接修改成员变量的值会不会触发KVO3.4 KVC修改属性会触发KVO吗3.5 KVO怎么监听数组的元素变化 KVC 1. KVC赋值原理 setValue:forKey: 首先会按照setKey、_setKey的顺序查找方法找到方法直接调用方法并赋值未找到方法则调用 (BOOL)accessInstanceVariablesDirectly是否可以直接访问成员变量默认返回YES;若accessInstanceVariablesDirectly方法返回YES则按照_key、_isKey、key、isKey的顺序查找成员变量找到直接赋值找不到则抛出NSUnknowKeyExpection异常若accessInstanceVariablesDirectly方法返回NO那么就会调用setValue:forUndefinedKey:并抛出NSUnknowKeyExpection异常 2. KVC取值原理 valueForKey: 首先会按照getKey、key、isKey、_key的顺序查找方法找到直接调用取值若未找到则查看 (BOOL)accessInstanceVariablesDirectly的返回值若返回NO则直接抛出NSUnknowKeyExpection异常若返回的YES则按照_key、_isKey、key、isKey的顺序查找成员变量找到则取值找不到则调用valueForUndefinedKey:抛出NSUnknowKeyExpection异常 3. 注意 key的值必须正确如果拼写错误会出现异常。当key的值是没有定义的valueForUndefinedKey:这个方法会被调用如果你自己写了这个方法key的值出错就会调用到这里来。因为类可以反复嵌套所以有个keyPath的概念keyPath就是用.号来把一个一个key链接起来这样就可以根据这个路径访问下去。NSArrayNSSet等都支持KVC。可以通过KVC访问自定义类型的私有成员。如果对非对象传递一个nil值KVC会调用setNIlValueForKey方法我们可以重写这个方法来避免传递nil出现的错误对象并不会调用这个方法而是会直接报错。处理非对象setValue时如果要赋值的对象是基本类型需要将值封装成NSNumber或者NSValue类型valueForKey时返回的是id类型的对象基本数据类型也会被封装成NSNumber或者NSValue。valueForKey可以自动将值封装成对象但是setValue:forKey:却不行。我们必须手动讲值类型转换成NSNumber/NSValue类型才能进行传递initWithBool:(BOOL)value。 4. KVC的批量存值和取值 interface Person : NSObject property (nonatomic, strong) NSString *name; property (nonatomic, strong) NSString *sex; property (nonatomic, strong) NSString *age; end // KVC批量赋值 - (void)kvc_setKeys {NSDictionary *kvc_dict {name: clearlove, sex: male, pr_age: 21};Person *pr [[Person alloc] init];[pr setValuesForKeysWithDictionary:kvc_dict];NSLog(%, pr.age); }// KVC批量取值 - (void)kvc_getValues {Person *pr [[Person alloc] init];[pr setValue:mekio forKey:name];[pr setValue:male forKey:sex];[pr setValue:120 forKey:pr_age];NSDictionary *pr_dict [pr dictionaryWithValuesForKeys:[name, age, sex]];NSLog(%, pr_dict); }如果有取值或者赋值的时候有key和属性不对应重写- (void)setValue:(id)value forUndefinedKey:(NSString *)key 方法 上面代码是已经重写的部分 - (void)setValue:(id)value forUndefinedKey:(NSString *)key {if ([key isEqualToString:pr_age]) {self.age (NSString *)value;} }KVO 使用 1. KVO的介绍 KVO的全称是Key Value Observing 键值监听可以用于监听某个对象属性值的改变 KVO时苹果提供的一套事件通知机制 KVO和NSNotificationCenter都是iOS观察者模式的实现。 区别 NSNotificaionCenter可以存在一对多而KVO则是 一对一的 关系。 2. KVO监听的步骤 注册监听 通过[addObserver:forKeyPath:options:context:]方法注册KVO这样可以接收到keyPath属性的变化事件 observer观察者监听属性变化的对象。该对象必须实现observeValueForKeyPath:ofObject:change:context: 方法。 keyPath要观察的属性名称。要和属性声明的名称一致。 options回调方法中收到被观察者的属性的旧值或新值等对KVO机制进行配置修改KVO通知的时机以及通知的内容 context传入任意类型的对象在接收消息回调的代码中可以接收到这个对象是KVO中的一种传值方式。 监听实现 通过方法[observeValueForKeyPath:ofObject:change:context:]实现KVO的监听 keyPath被观察对象的属性 object被观察的对象 change字典存放相关的值根据options传入的枚举来返回新值旧值 context注册观察者的时候context传递过来的值 移除监听 在不需要监听的时候通过方法[removeObserver:forKeyPath:]移除监听 例子 在view实现一个button监听person的name变化。 // kvo监听 - (void)kvo_pr {NSDictionary *kvc_dict {name: clearlove, sex: male, pr_age: 21};self.pr_1 [[Person alloc] init];[self.pr_1 setValuesForKeysWithDictionary:kvc_dict];[self.pr_1 addObserver:self forKeyPath:name options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionaryNSKeyValueChangeKey,id *)change context:(void *)context {NSLog(new_name %, [change valueForKey:new]); } - (void)dealloc {[self.pr_1 removeObserver:self forKeyPath:name]; }如果想控制当前对象的自动调用过程也就是由上面两个方法发起的KVO调用则可以重写下面方法。方法返回YES则表示可以调用相关对象的监听事件如果返回NO则表示不可以调用相关对象的监听事件。如果name不可以被监听在persn的实现重写(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key 方法 // 禁止监听某个属性(BOOL)automaticallyNotifiesObserversForKey:(NSString *)key {if ([key isEqualToString:name]) {NSLog(forbid Nostifity pr.name);return NO;}return [super automaticallyNotifiesObserversForKey: key]; }3. KVO的传值 可以通过方法context传入任意类型的对象在接收消息回调的代码中可以接收到这个对象是KVO中的一种传值方式。通过KVO在Model和Controller之间进行通信。 4. KVO注意 调用[removeObserver:forKeyPath:]需要在观察者消失之前否则会导致Crash。在调用addObserver方法后KVO并不会对观察者进行强引用所以需要注意观察者的生命周期否则会导致观察者被释放带来的Crash。观察者需要实现observeValueForKeyPath:ofObject:change:context:方法当KVO事件到来时会调用这个方法如果没有实现会导致Crash。KVO的addObserver和removeObserver需要是成对的如果重复remove则会导致NSRangeException类型的Crash如果忘记remove则会在观察者释放后再次接收到KVO回调时Crash。 5. KVO的使用场景 对于时刻变化的对象例如colletionView的items总是动态的变化这个时候可以使用KVO监听对象。在AVFounditon中获取AVPlayer的播放进度播放状态也需要使用KVO来观察。 KVO原理 1. KVO的本质是改变了setter方法的调用 利用Runtime API动态生成一个子类NSKVONotifying_XXX并且让instance对象的isa指向这个全新的子类NSKVONotifying_XXX的superclass指针指向原来的类当修改instance对象的属性时会调用Foundation的_NSSetXXXValueAndNotify函数 2. _NSSetXXXValueAndNotify的内部实现原理 - setName最主要的重写方法set值时调用通知函数 - class返回原来类的class - dealloc - _isKVOA判断这个类有没有被KVO动态生成子类- (void)setClassName:(NSString *)className {}- (Class)class { - 这是为了保证该中间类在外部使用时可以替代原始类实现完全透明的KVO功能。return [testClass class]; }- (void)dealloc {// 收尾工作 }- (BOOL)_isKVOA { - 添加一个名为_isKVOA的实例变量**用于标识该对象是否支持KVO机制。return YES; } 重写Class方法 这是为了保证该中间类在外部使用时可以替代原始类实现完全透明的KVO功能。 添加一个名为_isKVOA的实例变量用于标识该对象是否支持KVO机制。 3. _NSSetObjectValueAndNotify 在具体实现过程中系统会动态生成一个继承自原始类的中间类_NSSetXXXValueAndNotify并且在该类的初始化方法中调用了一个叫做_NSSetObjectValueAndNotify()的函数用于实现属性改变的通知。 _NSSetObjectValueAndNotify()函数的实现过程如下 a) 首先会调用 willChangeValueForKey b) 调用原来的setter实现然后给属性赋值 c) 最后调用 didChangeValueForKey d) 最后调用 observer 的 observeValueForKeyPath 去告诉监听器属性值发生了改变 . 4. 手动调用KVO 修改类方法automaticallyNotifiesObserversForKey的返回值;调用KVO主要依靠两个方法在属性发生改变之前调用willChangeValueForKey方法在发生改变之后调用didChangeValueForKey方法即可 5. KVO的实现的注意 当观对象移除所有的监听后会将观察对象的isa指向原来的类。当观察对象的监听全部移除后动态生成的类不会注销而是留在下次观察的时候在用避免反复创建中间子类。 6. KVO类指针交换 isa-swizzling类指针交换就是把当前某个实例对象的isa指针指向一个新建造的中间类在这个新建造的中间类上面做hook方法或者别的事情这样不会影响这个类的其他实例对象仅仅影响当前的实例对象。 KVO总结 1. KVO的本质 利用RuntimeAPI动态生成一个子类并且让instance对象的isa指向这个全新的子类当修改instance对象的属性时会调用Foundation的_NSSetXXXValueAndNotify函数接着调用父类原来的setter方法修改属性的值。最后调用didChangeValueForKey其内部会触发监听器(Oberser)的监听方法(observerValueForKeyPath:ofObject:change:context:); 2. KVO实现过程总结 调用 addObserver:forKeyPath:options:context:context调用的时候会自动生成并注册一个该对象被观察的对象对应类的子类取名NSKVONotify_Class,并且将该对象的isa指针指向这个新的类。在该子类内部实现4个方法-被观察属性的set方法、class方法、isKVO、delloc。最关键的是set方法中先调用willChangeValueForKey再调用原来的setter方法给成员变量赋值最后调用didChangeValueForKey。 willChangeValueForKey和didChangeValueForKey需要成对出现才能生效在didChangeValueForKey中会去调用观察者的observeValueForKeyPath: ofObject: 方法。 重写class方法这样避免外部感知子类的存在同时防止在一些使用isKindOfClass判断的时候出错。isKVO方法作为能否实现KVO功能的一个标识。delloc里面还原isa指针 KVO KVC 问题总结 3.1 isa混写之后如何调用方法 调用监听的属性设置方法例如setAge都会先调用NSKVONotify_Person对应的属性设置方法。调用非监听属性设置方法如test会通过NSKVONotify_Person的superclass来找到Person类对象再调用起[Person test]方法。 3.2 为什么在生成的子类内部重写class方法 如果没有重写class方法当对象调用class方法的时候会在自己的方法缓存列表、方法列表、父类缓存、方法列表一直向上去查找该方法因为class方法是NSObject中的方法如果不重写最终可能会返回NSKVONotifying_Person就会将该类暴露出来。 3.3 直接修改成员变量的值会不会触发KVO 不会触发KVOKVO的本质是替换了setter方法的实现所以只有通过set方法修改才会触发KVO。 3.4 KVC修改属性会触发KVO吗 会的 尽管setvalue:forkey:方法不一定会触发instance实例对象的setter方法但是setvalue:forkey:在更改成员变量值的时候会手动调用willchangevalueforkey、didchangevalueforkey会触发监听器的回调方法。 3.5 KVO怎么监听数组的元素变化 KVO本来只能监听数组长度的变化不能监听内部对象的变化我们可以手动KVC修改数组内部的元素达到目的。 我们可以通过KVC来对数组进行添加元素的操作这样就可以监听到了。通过KVC的mutableArrayValueForKey:等方法获得代理对象当代理对象的内部对象发生改变时会回调KVO监听的方法。集合对象包含NSArray和NSSet。
http://www.pierceye.com/news/124482/

相关文章:

  • 长安网站建设详细教程鸿科经纬教网店运营推广
  • 微信营销模式有seo短视频网页入口引流推广
  • 做商城网站简单吗长春网站建设服务
  • 工厂弄个网站做外贸如何app开发报价公司
  • 网销网站建设流程如何创建网站挣钱
  • 韶关网站制作手机推广app
  • Linux做视频网站网速均衡网页编辑实践报告
  • 做ppt好的模板下载网站如何查看网站空间商
  • 武义公司网站建设公司如何建设网站首页
  • hdwiki做网站罗湖网站建设联系电话
  • 深圳网站建设 利科技wordpress插件 手机版
  • 南通优普网站建设团队课程设计模板
  • 网站建设与维护的选择题浦东新区做网站
  • 做视频网站视频放在哪里网站备案目的
  • 建设部安全事故通报网站怎么更改网站的备案号
  • 重庆网站建设维护网络推广引流方法
  • 精品网站开发分销网站建站
  • 建设一个教程视频网站需要什么资质策划书案例范文
  • 郑州汉狮做网站的大公司海尔网站建设
  • 成都网站制作成都重庆网红景点排名
  • 广西南宁市网站制作公司制作图片的软件加字体
  • 新手搭建网站教程品牌推广费用预算
  • 广州网站设计网站制作竞价托管多少钱
  • 创建企业营销网站包括哪些内容软考高项彻底没用了
  • 企业品牌网站建设方案无锡网站设计多少钱
  • 轻量级网站开发在线旅游网站平台有哪些
  • 怎么用vs做网站推广优化网站排名
  • 免费推广网站软件常宁网站建设常宁网站建设
  • 冀州市网站建设html编辑器安卓版手机版软件
  • 广州专业网站改版方案网站建设要做ui和什么