美文网首页RunTime面试
Runtime底层各个结构体

Runtime底层各个结构体

作者: lionsom_lin | 来源:发表于2017-09-06 16:31 被阅读155次

一、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

相关文章

  • Runtime底层各个结构体

    一、Objective-C消息传递 分析:1.1、这个过程并非立刻指向foo的内存开始执行,而且有个一传递的过程,...

  • iOS Class的结构

    一、底层结构 我们可以通过runtime的底层源码看的class的底层结构体,简化如下: 然后点进去之后他们之间的...

  • Category总结

    Category的底层结构 定义在objc-runtime-new.h中 生成C++代码中可以看到如下的结构体 C...

  • iOS runtime总结数据结构,消息传递、转发和应用场景

    runtime篇 首先看一下runtiem底层的数据结构 首先从objc_class这么一个结构体(数据结构)开始...

  • Category 庖丁解牛版

    一.Category的底层结构 在runtime运行中都是一个category_t的一个结构体,里面包含{类名,对...

  • iOS weak的实现原理详解

    1、先上原理 weak声明的指针指向实例对象的原理就是利用runtime底层维护着一个 SideTable 结构体...

  • 探寻Category

    Category的底层结构 在源码的中,我们可以查看到Category的底层结构(objc-runtime-new...

  • iOS底层探索 --- 类的结构探索(上)

    今天我们将进行类的结构体的探索,其中有些内容我们在iOS底层探索 ---Runtime(一)--- 基础知识[ht...

  • iOS runtime(一)数据结构和元类

    Runtime全方位装逼指南Runtime系列(浅析数据结构) 数据结构 Class:结构体objc_class的...

  • Runtime基础知识

    Runtime相关的知识主要从以下几个问题入手吧 Runtime是何物 Runtime中的结构体 Runtime中...

网友评论

    本文标题:Runtime底层各个结构体

    本文链接:https://www.haomeiwen.com/subject/cfwudxtx.html