美文网首页
iOS runtime的理解

iOS runtime的理解

作者: 偏執的麻瓜 | 来源:发表于2020-04-04 17:59 被阅读0次

Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。

Objective-C是动态语言:
1.动态类型:
即id类型,在编译器编译的时候是不能被识别的,即程序运行的时候才会根据语境来识别。
2.动态绑定:
基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,也就是说让代码在运行时判断需要调用什么方法,而不是在编译时,这就是动态绑定。
3.动态加载:
根据需求加载所需要的资源。

runtime的应用:
1.动态创建一个类(比如KVO的底层实现)
2.动态地为某个类添加属性\方法, 修改属性值\方法
3.遍历一个类的所有成员变量(属性)\所有方法
实质上,以上的是通过相关方法来获取对象或者类的isa指针来实现的。

isa指针

每个Objective-C对象都有一个隐藏的数据结构,这个数据结构是Objective-C对象的第一个成员变量,它就是isa指针。

一个对象(Object)的isa指向了这个对象的类(Class),而这个对象的类(Class)的isa指向了metaclass,而它的isa指针最终指向的是一个根元类(root meteClass).根元类的isa指针指向本身,这样形成了一个封闭的内循环。这样我们就可以找到静态方法和变量了。

//对象
struct objc_object 
{
    Class isa  OBJC_ISA_AVAILABILITY;
};
//类
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_method_list {
    struct objc_method_list *obsolete                        OBJC2_UNAVAILABLE;
    int method_count                                         OBJC2_UNAVAILABLE;
 /* variable length structure */
    struct objc_method method_list[1]                        OBJC2_UNAVAILABLE;
#ifdef __LP64__
    int space                                                OBJC2_UNAVAILABLE;
#endif
}                                                   
//方法
struct objc_method 
{
    SEL method_name                                          OBJC2_UNAVAILABLE;
    char *method_types                                       OBJC2_UNAVAILABLE;
    IMP method_imp                                           OBJC2_UNAVAILABLE;
}

一个对象的方法像这样[obj foo],编译器转成消息发送objc_msgSend(obj, foo),Runtime时执行的流程是这样的:

首先,通过obj的isa指针找到它的 class ;
在 class 的 method list 找 foo ;
如果 class 中没到 foo,继续往它的 superclass 中找 ;
一旦找到 foo 这个函数,就去执行它的实现IMP 。

相关文章

  • iOS~runtime

    iOS~runtime理解iOS runtime学习笔记Objective-C Runtime让你快速上手Runt...

  • 多线程cocoachina资源

    iOS:学习runtime的理解和心得

  • IOS学习笔记--RunTime的理解

    IOS学习笔记--RunTime的理解 RunTime的理解 runtime:运行时刻是指一个程序在运行(或者在被...

  • 壹、面试复习OC篇之runtime

    暂时copy过来,过后添加自己理解 原文地址:iOS-runtime通篇详解-上 iOS-runtime通篇详解-...

  • ios runtime 详解

    前言 在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇...

  • iOS runtime实战应用:成员变量和属性

    前言 在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇...

  • iOS runtime实战应用:关联对象

    前言 在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 有筒子在面试的时候,遇...

  • iOS runtime实战应用:Method Swizzling

    前言 在开始之前建议先阅读iOS runtime的基础理解篇:iOS内功篇:runtime 现在IT届流行一个词叫...

  • iOS runtime

    概述 runtime是深刻理解iOS开发所必需理解的东西。下文中会整理runtime相关的内容,方便查阅学习。 什...

  • IOS runtime简介

    runtime是什么### 掌握runtime是做好iOS开发,或是深刻掌握Objective C所必需理解的东西...

网友评论

      本文标题:iOS runtime的理解

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