runtime 基础(一)

2017-02-03  本文已影响40人  我是C

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.

盗图


434405-20151227181339499-1243485875.png

如果我写的有问题,请告诉我,我会积极改正!

上一篇下一篇

猜你喜欢

热点阅读