博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ObjC运行时部分概念解析(二)
阅读量:6416 次
发布时间:2019-06-23

本文共 1771 字,大约阅读时间需要 5 分钟。

上篇文章简单的说明了两个关键字究竟是什么,这里主要讲讲ObjC中各种基本内存模型

Method

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

可以看到一个方法(Method)是一个指向objc_method的指针.包含了函数名,函数类型,函数地址.

函数类型应该就是函数签名,它看起来是类似于这样的"v@:" 这是代码运行时将代码和参数push进栈时确定各种类型后可以计算便宜来准确的获取参数,比如int 4个字节 指针8个字节,它们在内存中时紧密排列的,比如读到i,那么我去读4个字节作为int.读到@,去取8个字节....

下面是runtime中所有的类型

#define _C_ID       '@'#define _C_CLASS    '#'#define _C_SEL      ':'#define _C_CHR      'c'#define _C_UCHR     'C'#define _C_SHT      's'#define _C_USHT     'S'#define _C_INT      'i'#define _C_UINT     'I'#define _C_LNG      'l'#define _C_ULNG     'L'#define _C_LNG_LNG  'q'#define _C_ULNG_LNG 'Q'#define _C_FLT      'f'#define _C_DBL      'd'#define _C_BFLD     'b'#define _C_BOOL     'B'#define _C_VOID     'v'#define _C_UNDEF    '?'#define _C_PTR      '^'#define _C_CHARPTR  '*'#define _C_ATOM     '%'#define _C_ARY_B    '['#define _C_ARY_E    ']'#define _C_UNION_B  '('#define _C_UNION_E  ')'#define _C_STRUCT_B '{'#define _C_STRUCT_E '}'#define _C_VECTOR   '!'#define _C_CONST    'r'

Ivar(实例变量)

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}

一个实例变量包含变量名,变量类型(int,long,id...),偏移,这个是从1个对象获取该实例变量存放的位置用的.最后space目前尚不清楚

转载于:https://www.cnblogs.com/qianhongqiang/p/6022646.html

你可能感兴趣的文章
css3动画简介以及动画库animate.css的使用
查看>>
javascript DOM节点操作
查看>>
c++ invoke java in android
查看>>
meta 之 viewport
查看>>
Linux下文件 ~/.bashrc 和 ~/.bash_profile 和 /etc/bashrc 和 /etc/profile 的区别 | 用户登录后加载配置文件的顺序...
查看>>
关于在swiper轮播组件中使用echarts的'click'事件无效
查看>>
Android开源项目README规范
查看>>
asp.net core 教程(五)-配置
查看>>
Spring Bean Scope (作用域)
查看>>
Redis命令操作详解
查看>>
SSL协议详解
查看>>
javascript正则表达式和字符串RegExp
查看>>
高级软件工程团队第一次作业
查看>>
java_Collection 类集
查看>>
HQL查询语言——转载(http://www.cnblogs.com/20gg-com/p/6045739.html)
查看>>
spring cloud DashBoard
查看>>
python基础学习14----正则表达式
查看>>
vue-router
查看>>
洛谷P1962 斐波那契数列
查看>>
题解——HDU 4734 F(x) (数位DP)
查看>>