OC对象内存与KVO解析:底层原理与实战应用
需积分: 9 24 浏览量
更新于2024-07-09
收藏 2.84MB PDF 举报
OC(Objective-C)是一种面向对象的编程语言,被广泛应用于iOS开发。本文档深入探讨了Objective-C语法的底层原理,主要包括以下几个关键知识点:
1. 对象内存管理:
- NSObject对象的内存占用:每个NSObject实例在系统中占用16个字节(通过malloc_size函数计算),但在64位环境中,实际使用空间约为8个字节,这是通过class_getInstanceSize函数获取的。
- 内存布局:对象内存中包含了isa指针,它是对象与所属类或其元类关联的关键。isa指针指向的是类对象,而类对象的isa指向其对应的元类对象,元类对象的isa则指向基类的元类。
2. 类信息存储:
- 类信息结构:对象的方法、属性、成员变量和协议信息存储在class对象中,而类方法则存储在相应的元类对象中。
- 实例变量:成员变量的具体值存储在实例对象的内存中,这些值随着对象的创建而实例化。
3. KVO(Key-Value Observing)机制:
- KVO实现原理:通过Runtime API动态创建子类,将实例对象的isa指向新的子类。当属性值改变时,会调用Foundation框架的相关函数(如_NSSetXXXValueAndNotify),并触发`willChangeValueForKey:`、父类的setter和`didChangeValueForKey:`方法,进而通知观察者执行`observeValueForKeyPath:ofObject:change:context:`方法。
- 手动触发KVO:可以直接调用`willChangeValueForKey:`和`didChangeValueForKey:`来手动触发观察者通知。
- KVO触发条件:直接修改成员变量不会触发KVO,但通过KVC(Key-Value Coding)修改属性会触发。
4. Category和ClassExtension:
- Category用途:适用于扩展现有类的功能,提供私有接口或在运行时添加新的行为,但不改变已有类的结构。
- Category底层实现:编译后的Category结构为struct category_t,包含新增的方法、属性等信息。在运行时,这些信息会被合并到目标类或元类中。
- Category与ClassExtension差异:ClassExtension在编译时即被包含在类信息中,提供了静态的扩展,而Category是动态添加的,对类的行为进行扩展或重写。
理解这些底层原理对于iOS开发者来说至关重要,有助于优化内存管理,提高代码效率,并能更好地利用Objective-C的动态特性来增强应用程序的功能。通过掌握这些知识点,开发者能够更深入地理解和利用Objective-C进行iOS开发。
143 浏览量
2024-08-15 上传
217 浏览量
131 浏览量
2021-10-07 上传
219 浏览量
141 浏览量
abc1892933
- 粉丝: 0
- 资源: 7
最新资源
- WebMiniProject
- ns-react-18next:[未维护]命名空间中的i18next本地化ReactSwift
- TemplateVue-bootstrap3-sass:模板
- 一组医疗图标 .xd .sketch .svg .fig素材下载
- Rad Studio XE 10.4 Patch 补丁合集 截止2020.7.29
- 基于HTML实现的仿智慧园区触屏版html5手机门户网站模板下载(css+html+js+图样).zip
- rhythmless.github.io:我的互联网片段
- BalanceCar调试版,计算机博弈大赛c语言源码,c语言
- qblueRed42.github.io
- torchdrift-redisai:RedisAI中的TorchDrift
- rnp-find:用于探索RNA与蛋白质相互作用的生物信息学工具
- ant-apache-bcel-1.9.3.zip
- C1220G1_NguyenDucHau
- flutter-localized-locales:Flutter插件,它提供语言环境代码到563个语言环境的名称映射
- html推箱子.zip
- 基于PCB的最新PCB及相关材料IEC标准信息 国际电工委员会.zip