iOS-底层原理(13)-runtime之isa详解

2018-09-05  本文已影响141人  路飞_Luck
序言
位运算和共用体
位运算

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。

C++提供了6种位运算符来进行位运算操作:

位运算的操作数是整数类型或字符型.

1.按位与&运算

相同为一

& 运算常常用来将某变量的某些位清0
& 也常用于二进制取位操作

2.按位或|运算

有一则一

|运算通常用于二进制特定位上的强制置1

3.按位异或^运算

^运算通常用于对二进制的特定一位进行取反操作

共用体

共用体把几种不同数据类型的变量存放在同一块内存里。共用体中的变量共享同一块内存。

定义共用体类型变量的一般形式:

union 共用体名
{
    成员列表
}变量列表;

union的主要特征有

一 isa详解
image.png isa结构.png

实例代码如下 - 一定需要用真机进行调试

#import <Foundation/Foundation.h>
@interface CSPerson : NSObject
@end

创建一个对象并且断点调试,输出 isa 值

image.png image.png image.png image.png image.png image.png image.png
isa参数详解
为什么要&ISA_MASK来获取类或元类的地址

因为从arm64位开始,isa里面存储各种信息,是一个共用体,其中shiftcls 33位才是用来存放地址。通过&ISA_MASK就可以将33位的地址值取出来。

无论是实例对象,还是类对象,还是元类对象,他们的地址最后一位要么是0,要么是8,因为他们的地址是isa & ISA_MASK,又因为ISA_MASK最后3位都是0,所以导致他们的地址最后3位也永远是0,所以最后一位要么是0(0000 0000),要么是8(0000 0100)


本文主要参考MJ老师的教案,非常感谢MJ老师。

项目连接地址 - runtime_union_mask


关于runtime更多文章请看如下链接
iOS-runtime-API详解+使用
iOS Runtime原理及使用
iOS - runtime如何通过selector找到对应的 IMP地址(分别考虑类方法和实例方法)
iOS - Runtime之面试题详解一
iOS-runtime之面试题详解二
iOS runtime的使用场景-实战篇

上一篇 下一篇

猜你喜欢

热点阅读