IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> iOS_isa结构 -> 正文阅读

[移动开发]iOS_isa结构

联合体与位域

共用同一内存空间,联合体内占用空间最大的那个

@interface Trnk : NSObject
@property (nonatomic, assign) BOOL front;
@property (nonatomic, assign) BOOL back;
@property (nonatomic, assign) BOOL left;
@property (nonatomic, assign) BOOL right;
@end
#define DirectionFrontMask    (1 << 0)
#define DirectionBackMask     (1 << 1)
#define DirectionLeftMask     (1 << 2)
#define DirectionRightMask    (1 << 3)

@interface Tank () {
    // 联合体
    union{
        char bits;
        // 位域
        strcut {
            char front : 1;
            char back  : 1;
            char left  : 1;
            char right : 1;
        };
    } _direction;
}
@end
@implementation LGTank

- (instancetype)init
{
    self = [super init];
    if (self) {
        _direction.bits = 0b0000000000;
    }
    return self;
}

- (void)setFront:(BOOL)isFront {
    if (isFront) {
        _direction.bits |= DirectionFrontMask;
    } else {
        _direction.bits &= ~DirectionFrontMask;
    }
}

isa结构

isa就是一个联合体(union isa_t)<长度8字节/64位>

  • nonpointer:标识是否对isa指针开启指针优化
    0:纯isa指针,1:不止是类对象地址,isa中包含了类信息、对象的引用计数等
  • has_assoc:关联对象标志位,0没有,1存在
  • has_cxx_dtor:该对象是否有C++ 或者Objc的析构器,如果有析构函数,则需要做析构逻辑,如果没有,则可以更快的释放对象
  • shiftcls:存储类指针的值。开启指针优化的情况下,在arm64架构中有33位用来存储类。 newisa.shiftcls = (uintptr_t)cls >> 3
  • magic:用于调试器判断当前对象是真的对象还是没有初始化的空间
  • weakly_referenced:标志对象是否被指向或者曾经指向一个ARC的弱变量,没有弱对象的对象可以更快释放。
  • deallocating:标志对象是否正在释放内存
  • has_sidetable_rc:当对象引用计数大于10时,则需要借用该变量存储进位
  • extra_rc:当表示该对象的引用计数值,实际上是引用计数值减1,例如,如果对象的引用计数为10,那么extra_rc为9。如果引用计数大于10,则需要使用到has_sidetable_rc来进行借位存储
union isa_t {
	isa_t() {}
	isa_t(uintptr_t value) : bits(value) {}
	Class cls;
	uintptr_t bits;
#if define(ISA_BITFIELD)
	struct {
		ISA_BITFIELD;
	}
#endif
}
//  arm64架构下  ISA_BITFIELD
	uintptr_t  nonpointer				:1;
	uintptr_t  has_assoc				:1;
	uintptr_t  has_cxx_dtor				:1;
	uintptr_t  shiftcls					:33;
	uintptr_t  magic					:6;
	uintptr_t  weakly_referenced		:1;
	uintptr_t  deallocating				:1;
	uintptr_t  has_sidetable_rc			:1;
	uintptr_t  extra_rc					:19;
	

对象<isa >与类<cls>关联

  • 对象的第一个属性必然是isa,由于其来自于父类
  • 对象与类关联方式<isa.bits & ISA_MASK = Class>
// 以下对象<obj>均为非TaggedPointer对象,且存在

// 根据对象获取类
Class object_getClass (id obj) {
	if (obj) return obj->getIsa();
	else return Nil;
}

objc_object::getIsa() {
	if (!isTaggedPointer())  return ISA();
	
	uintptr_t ptr = (uintptr_t)this;
	if (isTaggedPointer()) {
		// 省略...
	} else {
	  	// 省略...
	}
}

objc_object::ISA() {
	assert(!isTaggedPointer());
#if SUPPORT_INDEXED_ISA
	if (isa.nonpointer) {
		uintptr_t slot = isa.indexcls;
		return classForIndex((unsigned)slot);
	}
	return (Class)isa.bits;
#else
	return (Class)(isa.bits & ISA_MASK)
#endif
}
  • 对象当前内存中可以有多个,类在当前内存中只存在一份
// class1~4结果一致,则可以证明类只存在一份
Class class1 = [Person class];
Class class2 = [Person alloc].class;
Class class3 = [Person alloc].class;
Class class4 = object_getClass([Person alloc]);
NSLog(@"\n%p-\n%p-\n%p-\n%p",class1,class2,class3,class4)

类<Class>、元类<Meta Class>、根类<Root Class>、根元类<Root Meta Class>

  • 类的内存第一个位置指向元类

  • 类的内存是由系统创建,可以说类是通过元类进行创建的类对象

  • 元类是由系统编译生成的

  • 类对象的<isa>通过object_getClass(obj)的方式获取到元类

  • 元类的<isa>可以通过object_getClass(obj)的方式获取到根类

  • 根类的<isa>可以通过object_getClass(obj)的方式获取到根元类

  • 根元类的<isa>可以通过object_getClass(obj)的方式获取到根元类

  • 总结:对象isa -> 类、类isa -> 元类、元类isa ->根类、根类isa->根元类 、根元isa-> 根元类

isa流程图

  • 虚线为isa流程图
  • 实线为类继承关系
  • NSObject 的父类为nil,根元类的父类是NSObject
    isa流程图
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-10-25 12:38:54  更:2021-10-25 12:39:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:51:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码