赞
踩
从本篇文章开始,就进入runtime的正篇。关于runtime的源码,大家可以在github中下载:
OC是一门动态语言,与C++这种静态语言不同,静态语言的各种数据结构在编译期已经决定了,不能够被修改。而动态语言却可以使我们在程序运行期,动态的修改一个类的结构,如修改方法实现,绑定实例变量等。
OC作为动态语言,它总会想办法将静态语言在编译期决定的事情,推迟到运行期来做。所以,仅有编译器是不够的,它需要一个运行时系统(runtime system),这也就是OC的runtime系统的意义,它是OC运行框架的基石。
我们的OC语言是离不开runtime的。我们会在三个层次上和runtime进行交互,分别是:OC源码,通过Foundation框架定义的NSObject方法,直接调用runtime提供的接口方法。
isKindOfClass
和isMemberOfClass
检查类是否属于指定的Class的继承体系中;responderToSelector
检查对象是否能响应指定的消息;conformsToProtocol 检查对象是否遵循某个协议;methodForSelector
返回指定方法实现的地址。/usr/include/objc
目录下。许多函数允许你用纯C代码来重复实现 Objc 中同样的功能。虽然有一些方法构成了NSObject类的基础,但是你在写 Objc 代码时一般不会直接用到这些函数的,除非是写一些 Objc 与其他语言的桥接或是底层的debug工作。在Objective-C Runtime Reference 中有对 Runtime 函数的详细文档。就如在我们在前传篇中提到的,所谓的runtime黑魔法,只是基于OC各种底层数据结构上的应用。
因此,要想了解runtime,就要先了解runtime中定义的各种数据结构。我们先从最基础的objc_object和objc_class开始。
我们知道,在OC中,基本上所有的类的基类,都是NSObject
。因此要深入了解OC中的类的结构,就要从NSObject
这个类说起。
在XCode中,我们可以通过查看定义来了解NSObject
的实现:
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
NSObject
仅有一个实例变量Class isa
:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
Class
实质上是指向objc_class
的指针。而objc_class
的定义又是如何呢,在XCode中,我们继续查看定义:
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。