OC底层揭秘:语法、KVC+KVO、关联对象与block深入解析

需积分: 9 9 下载量 45 浏览量 更新于2024-07-18 收藏 7.02MB PPTX 举报
OC(Objective-C)是一种面向对象的编程语言,广泛应用于iOS和MacOS开发中。本课程专注于讲解OC底层原理,包括关键概念如KVC(Key-Value Coding)、KVO(Key-Value Observing),以及一些重要的编程技术,如Category、load和initialize方法,关联对象,以及Objective-C对象的本质。 首先,让我们来理解Objective-C对象的基础。一个NSObject对象在系统中的内存占用是相当基础的。默认情况下,它由系统分配16个字节(在64位环境下,这可能因架构不同而略有差异),但实际使用空间仅为8个字节。这些内存被分为几个部分:其中isa指针是关键,它指向该对象所属的类或metaclass。对于实例对象,isa指向类对象;类对象的isa则指向其metaclass;而metaclass的isa指向基类的metaclass。 OC的类信息存储在类对象和metaclass对象中,分别包含了对象方法、属性、成员变量和遵循的协议等。类方法则存储在metaclass中。每个对象实例的成员变量值存储在其自身的实例空间内。 KVO的核心在于通过Runtime API实现动态代理。通过动态创建子类并让实例对象的isa指向新的子类,当属性值改变时,Foundation框架会调用`_NSSetXXXValueAndNotify`函数,触发`willChangeValueForKey:`、父类的setter方法,以及通知观察者执行`observeValueForKeyPath:ofObject:change:context:`方法。 手动触发KVO需要调用`willChangeValueForKey:`和`didChangeValueForKey:`方法,但直接修改成员变量本身不会自动触发KVO。然而,通过KVC修改属性时,确实会触发KVO机制,因为KVC的赋值和取值过程实际上是通过发送消息给对象进行的,这隐含了属性的更改,从而引发KVO通知。 Category是Objective-C中一种实用的设计模式,主要用于扩展已有的类的功能,但不改变其接口。Category在编译阶段被转换成名为`struct category_t`的结构体,存储分类的方法、属性等信息。当程序运行时,runtime会将Category的内容合并到类或metaclass中,实现在运行时动态添加行为。 与Category不同的是,Class Extension(通常在Swift中称为Swift的扩展)在编译时就已内嵌在类信息中,它提供了对已有类功能的增强,但不像Category那样在运行时动态添加。两者的主要区别在于时机和集成方式:Class Extension是在编译时静态链接,而Category则是运行时动态附加。 总结来说,本课程深入探讨了Objective-C的语法和底层原理,涵盖了对象内存布局、KVC和KVO的工作机制、Category的使用场景和实现原理,以及类扩展与Category的比较,帮助开发者更好地理解和利用Objective-C进行高效编程。