RunTime面试

Runtime底层各个结构体

2017-09-06  本文已影响155人  lionsom_lin

一、Objective-C消息传递

  [object foo]; 

分析:
1.1、这个过程并非立刻指向foo的内存开始执行,而且有个一传递的过程,让我们有机可乘。
1.2、执行的时候给object发送了一个foo的消息

  [people TailName:@"name" Age:19];
类似于:C语言的
  obj_msgSend(people,@selector(TailName: Age:));

两个头文件库

#import <objc/objc.h>
#import <objc/runtime.h>     //C写的库
在OC中,类、对象和方法都是一个�C的结构体
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
结论:Class是一个objc_class结构类型的指针,Id是一个objc_object结构类型的指针。

objc_class结构体

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
结论:
struct objc_ivar_list {
    int ivar_count                                          
    struct objc_ivar ivar_list[1]                           
}       
struct objc_method_list {
    struct objc_method_list *obsolete                       
    int method_count                                        
    struct objc_method method_list[1]                       
}   
struct objc_method {
    SEL method_name                                          
    char *method_types                                      
    IMP method_imp                                           
}  
struct objc_protocol_list {
    struct objc_protocol_list *next;
    long count;
    __unsafe_unretained Protocol *list[1];
};

注:objc_method_list本质是一个有objc_method元素的链表,一个objc_method结构体中。

二、Xmind总结

Xmind文件:https://github.com/lionsom/LXRunTimeAll

Xmind总结 Runtime文件目录 Runtime各参数命名规则 runtime.h 中的一些参数介绍 obj.h中的参数 & Class与id的区别

三、方法调配(OC的机制,只存在OC)Method Swizzling

涉及到的主要方法:

demo地址:MethodSwizzling_005

https://github.com/lionsom/LXRunTimeAll

上一篇下一篇

猜你喜欢

热点阅读