文档章节

iOS Runtime详解之SEL,Class,id,IMP,_cmd,isa,method,Iva

小春0618
 小春0618
发布于 2016/05/08 13:53
字数 445
阅读 259
收藏 1

SEL/objc_selector

透明的数据结构,可以理解为C String

    typedef struct objc_selector *SEL;

也就是说,SEL是指向一个C String的指针。


id/objc_object

id - 指向一个类的实例对象 
底层代码定义

    typedef struct objc_object *id;

其中 
objc_object的底层定义

struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

可以看到,objc_object中,只是保存了一个Class类型的isa。这里看不懂不要怕,先记着,对象中就是保存了一个指向Objective C中对应类的指针。

Class/objc_class

Class - 指向Objective C类对象(objc_class)的一个指针 
底层定义

typedef struct objc_class *Class;

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;/* Use `Class` instead of `struct objc_class *` */

可以看到,这就是类对象结构体的定义,细心的同学可能发现了类对象里仍然有一个指针Class isa,先记着,这个isa指向的是类元对象。

IMP

IMP-指向实际执行函数体的函数指针

#if !OBJC_OLD_DISPATCH_PROTOTYPES
typedef void (*IMP)(void /* id, SEL, ... */ ); 
#else
typedef id (*IMP)(id, SEL, ...); 
#endif

可以看到,这个函数体前两个参数是 id(消息接受者,也就是对象),以及SEL(方法的名字)

method/objc_method

method - 指向Objective C中的方法的指针

typedef struct objc_method *Method;11

其中

struct objc_method {
    SEL method_name                                          OBJC2_UNAVAILABLE;    
   char *method_types                                       OBJC2_UNAVAILABLE;
   IMP method_imp                                           OBJC2_UNAVAILABLE;
}

_cmd

SEL 类型的一个变量,Objective C的函数的前两个隐藏参数为self 和 _cmd

Ivar

ivar - objective C中的实例变量

typedef struct objc_ivar *Ivar;

可以看到变量的内存模型

struct objc_ivar {
       char *ivar_name                                           OBJC2_UNAVAILABLE;
       char *ivar_type                                           OBJC2_UNAVAILABLE;
       int ivar_offset  OBJC2_UNAVAILABLE;
#ifdef __LP64__
       int space  OBJC2_UNAVAILABLE;
#endif
}

本文转载自:http://blog.csdn.net/hello_hwc/article/details/49682857

小春0618
粉丝 8
博文 40
码字总数 10552
作品 0
海淀
程序员
私信 提问
探秘Runtime - Runtime介绍

该文章属于原创,转载请注明: https://www.jianshu.com/p/ce97c66027cd 是系统中重要的组成部分,面试也是必问的问题,所以是一个工程师必须掌握的知识点。 现在市面上有很多关于的学习资料...

刘小壮
2018/11/16
14
0
(转载)Objective-C总Runtime的那点事儿(一)消息机制

原文地址:http://www.cocoachina.com/ios/20141018/9960.html 找工作,Objective-C中的Runtime是经常被问到的一个问题,几乎是面试大公司必问的一个问题。当然还有一些其他问题也几乎必问,...

小曼study
2017/03/15
0
0
Objective-C 的动态提示和技巧

过去的几年中涌现了大量的Objective-C开发者。有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语言的。也就是说有...

拉偶有所依
2015/01/05
202
2
手把手教你使用MJExtension(简单使用)

一、MJExtension第三方框架 我们在iOS开发过程中,我们常常需要将字典数据(也就是JSON数据)与Model模型之间的转化,例如网络请求返回的微博数据、等等,如果我们自己全部手动去创建模型并赋值...

贝勒老爷
2018/08/15
0
0
iOS运行时Runtime浅析

版权声明:本文为博主原创文章,欢迎分享到其它技术社区,分享请标明出处: https://blog.csdn.net/CHENYUFENG1991/article/details/51931320 运行时是iOS中一个很重要的概念,iOS运行过程中...

乞力马扎罗的雪CYF
2016/07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

面试官问:平时碰到系统CPU飙高和频繁GC,你会怎么排查?

处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题。当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警。本文主要针对系统运...

Java高级架构师n
18分钟前
8
0
面向对象编程

1、类和对象 类是对象的蓝图和模板,而对象是实例;即对象是具体的实例,类是一个抽象的模板 当我们把一大堆拥有共同特征的对象的静态特征(属性)和动态特征(行为)都抽取出来后,就可以定...

huijue
今天
12
0
redis异常解决 :idea启动本地redis出现 jedis.exceptions.JedisDataException: NOAUTH Authentication required

第一次安装在本地redis服务,试试跑项目,结果却出现nested exception is redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required错误,真是让人头疼 先检查一...

青慕
今天
24
0
Spring 之 IoC 源码分析 (基于注解方式)

一、 IoC 理论 IoC 全称为 Inversion of Control,翻译为 “控制反转”,它还有一个别名为 DI(Dependency Injection),即依赖注入。 二、IoC方式 Spring为IoC提供了2种方式,一种是基于xml...

星爵22
今天
29
0
Docker安装PostgresSql

Docker安装PostgresSql 拉取docker镜像 # docker pull postgres:10.1010.10: Pulling from library/postgres9fc222b64b0a: Pull complete 38296355136d: Pull complete 2809e135bbdb: Pu......

Tree
今天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部