Runtime底层各个结构体

一、Objective-C消息传递

  [object foo]; 

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

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

两个头文件库

#import 
#import      //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;
结论:
  • isa
    Class类型的指针,实例对象有个isa的属性,指向Class,而Class里也有isa属性,指向meteClass。
    OC中的任何类的定义都是对象
  • super class
    指向该类的父类,如果该类已经是最顶层的根类(NSObjuect),那么super_class就是NULL
  • name
    类的名字
  • version
    类的版本信息
  • info
    提供运行时期使用的一些位标识
  • instance_size
    该类的实例变量的大小
  • vars
    成员变量的链表
struct objc_ivar_list {
    int ivar_count                                          
    struct objc_ivar ivar_list[1]                           
}       
  • methodLists
    方法定义的链表
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                                           
}  
  • cache
    指向最近使用的方法,是一种优化机制,用于方法调用的优化
  • protocols
    协议链表
struct objc_protocol_list {
    struct objc_protocol_list *next;
    long count;
    __unsafe_unretained Protocol *list[1];
};

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

  • 函数名,也就是SEL
  • 表示函数原型的字符串
  • 函数的实现IMP(地址)

二、Xmind总结

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

Runtime底层各个结构体_第1张图片
Xmind总结

Runtime底层各个结构体_第2张图片
Runtime文件目录
Runtime底层各个结构体_第3张图片
Runtime各参数命名规则
Runtime底层各个结构体_第4张图片
runtime.h 中的一些参数介绍
Runtime底层各个结构体_第5张图片
obj.h中的参数 & Class与id的区别

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

涉及到的主要方法:

  • class_addMethod
  • class_replaceMethod
  • method_exchageImplementation

demo地址:MethodSwizzling_005

https://github.com/lionsom/LXRunTimeAll

你可能感兴趣的:(Runtime底层各个结构体)