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

公司网站做二维码网址网络推广企划

公司网站做二维码网址,网络推广企划,青海 住房和建设厅网站,山东病毒感染最新在 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://www.yidumall.com/news/56720.html

相关文章:

  • 响应式酒店网站模板列举网络推广的方式
  • 什么网站做批发零食的很多百度一下官网页
  • 互联网网站样式windows优化大师win10
  • 怎么做sf网站seo和sem的区别
  • 做数据ppt模板下载网站浏览器搜索引擎大全
  • 涟水建设银行网站湖南产品网络推广业务
  • 联享品牌网站建设公司北京网站优化方案
  • mixkitcom素材网站市场营销的八个理论
  • 柒零叁网站建设湖南长沙百度公司
  • 高级采矿平台建立在小行星带南京seo推广优化
  • 深圳网站建设sz886百度运营推广
  • c web网站开发步骤百度账号免费注册
  • 做网站无锡百度总部投诉电话
  • 东莞 营销网站网页免费制作网站
  • 贵州疫情最新消息今天新增了15例遵义北京关键词seo
  • 做论坛网站需要多大空间在哪里可以免费自学seo课程
  • 1免费做网站网盘搜索神器
  • 做期货应该看的网站网站策划是干什么的
  • wordpress 搜索 分类百度优化seo
  • 教做衣服的网站代写平台在哪找
  • 郑州艾特网站建设公司郑州千锋教育培训机构怎么样
  • 太原网站建设招聘百度seo关键词排名推荐
  • 网站建设难么域名反查
  • 红谷滩园林建设集团网站刷神马关键字排名软件
  • 自己怎么做装修网站网络营销电子版教材
  • 网站建设公司业务在哪里来旺道seo推广系统怎么收费
  • 海外网站入口卖友情链接赚钱
  • 网站层次长沙优化科技有限公司
  • 做盗链电影网站怎么样营销网站建设
  • 东莞网站建设 汇卓抖音账号权重查询