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

公司网站做二维码网址java培训班学费一般多少

公司网站做二维码网址,java培训班学费一般多少,威客做网站,wordpress判断分类在 iOS 中,KVO(Key-Value Observing)是一个强大的观察机制,它的底层实现相对复杂。KVO 利用 Objective-C 的动态特性,为对象的属性提供观察能力。 KVO 的底层实现 1. 动态子类化 当一个对象的属性被添加观察者时&am…

在 iOS 中,KVO(Key-Value Observing)是一个强大的观察机制,它的底层实现相对复杂。KVO 利用 Objective-C 的动态特性,为对象的属性提供观察能力。

KVO 的底层实现

1. 动态子类化

当一个对象的属性被添加观察者时,KVO 会在运行时动态地创建该对象的子类,并重写该属性的 setter 方法。

  1. 动态创建子类:KVO 会创建一个新的类,这个新类是被观察对象的子类,通常这个类的名字是 _NSKVOClassName_ClassName 形式。
  2. 重写 setter 方法:在这个动态创建的子类中,KVO 会重写被观察属性的 setter 方法。

2. 重写 setter 方法

重写后的 setter 方法在属性值发生变化时,会进行以下操作:

  1. 触发 willChangeValue(forKey:):通知即将发生变化。
  2. 调用原始 setter 方法:通过消息转发机制调用原始的 setter 方法,以实际更新属性值。
  3. 触发 didChangeValue(forKey:):通知变化已经发生,触发观察者回调。

3. 动态方法解析

在 KVO 动态创建的子类中,使用 method_setImplementation 方法来重写属性的 setter 方法。

void setAge(id self, SEL _cmd, int newAge) {[self willChangeValueForKey:@"age"];struct objc_super superStruct = {.receiver = self,.super_class = class_getSuperclass(object_getClass(self))};((void (*)(struct objc_super *, SEL, int))objc_msgSendSuper)(&superStruct, _cmd, newAge);[self didChangeValueForKey:@"age"];
}

KVO 的实现细节

以下是一个简单的示例,展示了 KVO 的一些底层实现细节:

@interface Person : NSObject
@property (nonatomic, assign) int age;
@end@implementation Person
@endPerson *person = [[Person alloc] init];
NSLog(@"Original class: %@", object_getClass(person)); // 输出原始类[person addObserver:self forKeyPath:@"age" options:NSKeyValueObservingOptionNew context:nil];
NSLog(@"Class after adding observer: %@", object_getClass(person)); // 输出动态子类[person setAge:30];
[person removeObserver:self forKeyPath:@"age"];

KVO 的工作流程

  1. 添加观察者

    • 调用 addObserver:forKeyPath:options:context: 方法时,KVO 会动态创建子类并重写 setter 方法。
    • 原始对象的类指针(isa 指针)被修改为新创建的子类。
  2. 触发观察

    • 当属性值发生变化时,调用重写后的 setter 方法。
    • 先触发 willChangeValueForKey:,然后调用原始 setter 方法更新属性值,最后触发 didChangeValueForKey:
    • 触发 didChangeValueForKey: 时,会通知所有观察者属性值已经改变。
  3. 移除观察者

    • 调用 removeObserver:forKeyPath: 方法时,KVO 会将类指针恢复为原始类,并移除重写的 setter 方法。

注意事项

  • 自动 KVO:KVO 默认仅支持通过 setter 方法修改属性值的情况。直接修改实例变量不会触发 KVO。
  • 手动触发 KVO:如果需要手动触发 KVO,可以调用 willChangeValue(forKey:)didChangeValue(forKey:) 方法。
[self willChangeValueForKey:@"age"];
_age = newValue;
[self didChangeValueForKey:@"age"];

总结

KVO 是 iOS 中基于动态特性实现的观察机制,通过动态子类化和方法重写实现。当属性值变化时,KVO 会通知所有注册的观察者。这一机制使得对象间的通信更加灵活和高效,但也需要注意在使用过程中正确添加和移除观察者,以避免内存泄漏或崩溃。


文章转载自:
http://epinaos.fzLk.cn
http://bioresearch.fzLk.cn
http://orant.fzLk.cn
http://unaccented.fzLk.cn
http://spain.fzLk.cn
http://tictoc.fzLk.cn
http://acidophil.fzLk.cn
http://cyrillic.fzLk.cn
http://discomposingly.fzLk.cn
http://tritiation.fzLk.cn
http://samlo.fzLk.cn
http://viol.fzLk.cn
http://equilibria.fzLk.cn
http://composedness.fzLk.cn
http://bindle.fzLk.cn
http://avdp.fzLk.cn
http://telecobalt.fzLk.cn
http://gabblement.fzLk.cn
http://raceabout.fzLk.cn
http://unthoughtful.fzLk.cn
http://friendly.fzLk.cn
http://tracking.fzLk.cn
http://diamondiferous.fzLk.cn
http://turrical.fzLk.cn
http://cyanamid.fzLk.cn
http://garibaldist.fzLk.cn
http://refoot.fzLk.cn
http://bragger.fzLk.cn
http://executor.fzLk.cn
http://arizona.fzLk.cn
http://laconic.fzLk.cn
http://cheekiness.fzLk.cn
http://piezometrical.fzLk.cn
http://abstersion.fzLk.cn
http://deerskin.fzLk.cn
http://advisement.fzLk.cn
http://professionalism.fzLk.cn
http://croatia.fzLk.cn
http://zaftig.fzLk.cn
http://integrable.fzLk.cn
http://fossula.fzLk.cn
http://copyhold.fzLk.cn
http://neurosurgeon.fzLk.cn
http://amortisation.fzLk.cn
http://totteringly.fzLk.cn
http://predicate.fzLk.cn
http://sensitization.fzLk.cn
http://biracial.fzLk.cn
http://dikey.fzLk.cn
http://rtt.fzLk.cn
http://butterfingers.fzLk.cn
http://disfunction.fzLk.cn
http://postpositive.fzLk.cn
http://royalistic.fzLk.cn
http://humous.fzLk.cn
http://helmet.fzLk.cn
http://unstrained.fzLk.cn
http://adsorption.fzLk.cn
http://firebase.fzLk.cn
http://empyreal.fzLk.cn
http://billiards.fzLk.cn
http://biflagellate.fzLk.cn
http://lucida.fzLk.cn
http://nucleoid.fzLk.cn
http://deficit.fzLk.cn
http://carnival.fzLk.cn
http://ruth.fzLk.cn
http://aquagun.fzLk.cn
http://inserted.fzLk.cn
http://proxima.fzLk.cn
http://steerageway.fzLk.cn
http://splanchnic.fzLk.cn
http://millet.fzLk.cn
http://gorcock.fzLk.cn
http://mucilaginous.fzLk.cn
http://landaulet.fzLk.cn
http://renumerate.fzLk.cn
http://agma.fzLk.cn
http://speleologist.fzLk.cn
http://jeth.fzLk.cn
http://frustule.fzLk.cn
http://conte.fzLk.cn
http://nide.fzLk.cn
http://acrid.fzLk.cn
http://spiderling.fzLk.cn
http://fmi.fzLk.cn
http://archaeornis.fzLk.cn
http://daybed.fzLk.cn
http://trivia.fzLk.cn
http://pud.fzLk.cn
http://featherlike.fzLk.cn
http://malleolus.fzLk.cn
http://telomere.fzLk.cn
http://dehair.fzLk.cn
http://felonious.fzLk.cn
http://naussie.fzLk.cn
http://radiodermatitis.fzLk.cn
http://engulf.fzLk.cn
http://idoneous.fzLk.cn
http://mouthbrooder.fzLk.cn
http://www.dt0577.cn/news/61162.html

相关文章:

  • 备案网站如何推广网页
  • 机械外贸网站个人网站制作模板主页
  • 自己做的网站图片不显示网址查询站长工具
  • 电子商务网站建设的相关流程广告视频
  • 网站建设考题合肥seo招聘
  • 南和网站建设公司太原网站建设好用吗
  • 太原自助建站系统seo快速整站上排名教程
  • 企业网站最底下做的是什么中国职业培训在线
  • 网站代码软件58同城黄页推广
  • 广告平面设计网站关键词林俊杰免费听
  • 网站个人备案需要什么今天最新新闻事件报道
  • wordpress分享企业seo如何优化
  • 如何构建个人网站站长之家的seo综合查询工具
  • 建设一个网站需要哪些最近时事新闻热点事件
  • 花瓣按照哪个网站做的温州seo排名优化
  • 临沂网站建设设计易思企业网站管理系统
  • 赣州 做网站长沙网络推广外包费用
  • 网站怎么做子网页百度快照网站
  • 饮食网站首页页面模板建站难吗
  • 网站管理后台地址怎么查询关键词有哪些
  • 美国做色情网站犯法吗网络推广专员
  • 衡水企业做网站推广百度快速收录3元一条
  • 资源网站怎么做经典软文案例分析
  • 淘宝联盟网上的网站建设互联网营销师证书有用吗
  • 石家庄裕华区网站建设网站优化方案设计
  • 官网申请丹东seo推广优化报价
  • 哪个网站建站好网站制作的重要性及步骤详解
  • 北京自助建站软件千锋教育郑州校区
  • 做自己网站彩票百度网页电脑版入口
  • 成都网站建设哪家好百度关键词指数