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 <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;
结论:
  • 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

Xmind总结

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

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

涉及到的主要方法:

  • class_addMethod
  • class_replaceMethod
  • method_exchageImplementation

demo地址:MethodSwizzling_005

https://github.com/lionsom/LXRunTimeAll

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,858评论 0 9
  • //联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄 objc_class结构体 一、类在OC中是obj...
    石虎132阅读 2,202评论 0 21
  • Objective-C语言是一门动态语言,他将很多静态语言在编译和链接时期做的事情放到了运行时来处理。这种动态语言...
    tigger丨阅读 1,476评论 0 8
  • runtime 运行时语言,实现Object-C的C语言库,将OC转换成C进行编译的过渡者。 作为一门动态编程语言...
    夜雨聲煩_阅读 565评论 0 0
  • 孔子说,三十而立,四十而不惑,五十知天命,六十花甲,七十古来稀,八十耄耋。而萍活到三十七岁,怎么觉得越活越倒退了呢...
    清浅光阴阅读 245评论 0 0