runtime是什么?
oc是动态语言,oc代码在运行时会转换成c语言代码。
你会问有什么用?
做业务来说用处不大。开发sdk,热修复等等用处大大的。
那为什么要了解runtime?
了解runtime你会对oc的运行机制理解更深刻,本身学程序就是学一种思想。
将实际问题以编程的思维来解决,也就是智能。
oc对象
每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。
看看oc对象的定义
@interface NSObject <NSObject> {
Class isa OBJC_ISA_AVAILABILITY;
}
//一个isa指针
看看Class
typedef struct objc_class *Class;//结构体
//结构体展开,注意下面的英文
struct objc_class {
//指向类对象的指针,类对象也是一个这样的结构体
Class isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class super_class; //父类
const char *name;
long version;
long info;
long instance_size;
struct objc_ivar_list *ivars;
struct objc_method_list **methodLists; //方法数组
struct objc_cache *cache; //缓存方法
struct objc_protocol_list *protocols;
#endif
} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */
oc有几种对象
一种是实例对象
一种是类对象
举例:
现在我有两个类,ClassA是父类,ClassB类是子类.
ClassA 两个方法: - methodA | +methodA
ClassB 两个方法: - methodB | +methodB
实例
a = [ClassA new];
b = [ClassB new];
实例调用
[b methodB]
---b指向ClassB->isa,isa去结构体遍历methodLists找到methodB方法;
[b methodA]
---因为ClassB 没有对应的方法,然后通过isa的super_class去遍历父类的methodLists,找到了methodA.
类调用
[ClassB methodB]
---ClassB的isa,isa中还有一个Class isa参数,这个isa指向的是一个类对象
[ClassB methodA]
---因为ClassB 没有对应的方法,然后通过isa的super_class去遍历父类的methodLists,找到了methodA.
盗图
如果我写的有问题,请告诉我,我会积极改正!