OC底层原理之OC语法课件ppt
### OC底层原理详解####一、Objective-C (OC)对象的本质Objective-C是一种面向对象的编程语言,它在C的基础上增加了面向对象的功能。在深入理解OC之前,我们需要了解OC对象的基本构成。 - **对象内存布局**: -在64位环境下,一个对象占用16个字节,但实际上只使用了8个字节。 -对象的`isa`指针非常重要,用于指向对象所属的类的信息。 - `instance`对象的`isa`指向`class`对象。 - `class`对象的`isa`指向`meta-class`对象。 - `meta-class`对象的`isa`指向基类的`meta-class`对象。 -类信息包括方法、属性等信息,存储在`class`对象中。 -对象方法、属性、成员变量、协议信息存储在`class`对象中。 -类方法存储在`meta-class`对象中。 -成员变量的具体值存储在`instance`对象中。 ####二、KVC (Key-Value Coding) - **KVC**是一种用于访问对象属性的方式,无需知道对象具体类型即可通过键名获取或设置对象的属性值。 - **KVC赋值与取值过程**: -赋值:调用`setValue:forKey:`方法。 -取值:调用`valueForKey:`方法。 -原理:`KVC`通过反射机制找到对应的方法来完成赋值或取值。 - **KVC与KVO的关系**: -通过`KVC`修改属性会触发`KVO`(如果设置了观察者)。 ####三、KVO (Key-Value Observing) - **KVO**用于观察对象属性的变化,当被观察属性变化时,会通知观察者。 - **实现方式**: -使用`Runtime API`动态生成一个子类,让`instance`对象的`isa`指向新子类。 -当属性改变时,调用`_NSSetXXXValueAndNotify`函数,触发`willChangeValueForKey:`和`didChangeValueForKey:`方法。 -观察者通过`observeValueForKeyPath:ofObject:change:context:`方法接收到属性变化的通知。 - **手动触发KVO**: -直接调用`willChangeValueForKey:`和`didChangeValueForKey:`方法。 -注意:直接修改成员变量不会触发KVO。 ####四、Category - **Category**是一种扩展类功能的方式,可以在不修改原类定义的情况下增加方法或属性。 - **使用场合**: -为了扩展已有类的功能而不直接修改类定义。 -提供私有接口或者扩展公有接口。 - **实现原理**: - Category编译后会被转换为`struct category_t`,其中包含方法列表。 -运行时,Category的信息会被合并到类信息中。 - **Category与Class Extension的区别**: - Class Extension在编译期间就会合并到类信息中。 - Category则是在运行时才合并。 - **load方法**: - Category包含`load`方法,在类或Category加载时由系统自动调用。 - `load`方法可以继承,但在实际应用中通常由系统自动调用。 - **load与initialize方法的区别**: - `load`方法在类加载时调用,而`initialize`方法在首次发送消息给类时调用。 -在Category中,`load`先于`initialize`调用。 ####五、Block - **Block**是Objective-C中的一个重要特性,它可以封装函数调用及其上下文环境。 - **Block原理**: - Block本质上是一个指向函数调用和环境的结构体。 -它可以捕获外部作用域内的变量,即使该变量在Block外部。 - **__block修饰符**: -用于声明可以被Block内部修改的变量。 -注意不要忘记释放这些变量以避免内存泄漏。 - **Block的内存管理**: - Block默认是在栈上创建的,若需保留较长时间,需使用`copy`将其复制到堆上。 -使用`copy`而非`retain`是因为Block内部可能包含对自身或其他对象的引用,导致循环引用问题。 ####六、Objective-C的底层实现- **Objective-C与C/C++**: - Objective-C底层实际上是C/C++代码。 -面向对象特性是基于C/C++的数据结构实现的。 - **数据结构**: -主要是基于结构体来实现对象和类。 -例如,`NSObject`对象的内存布局包括`isa`指针和成员变量。 - **转换为C/C++代码**: -可以使用`xcrun-sdkiphoneosclang-archarm64-rewrite-objc`命令将OC源文件转换为C/C++代码。以上内容涵盖了Objective-C中的一些核心概念和技术细节,对于深入理解和掌握Objective-C非常关键。
7.02MB
文件大小:
评论区