高效运行机制揭秘:深度解析第01期

更新:11-15 民间故事 我要投稿 纠错 投诉

大家好,今天小编来为大家解答高效运行机制揭秘:深度解析第01期这个问题,很多人还不知道,现在让我们一起来看看吧!

你平时写的Objective-C代码会被编译器转换成运行时代码,很多操作都会推迟到运行时。

当我们导入objc/runtime.h和objc/message.h时,会发现代码提示不完整。原因是从Xcode5开始,官方不建议我们手动调用Runtime API。可以通过修改Build Settings中的一个配置项来解决。

默认值为YES,将其更改为NO。

Runtime 的具体应用

使用AssociatedObject 将属性添加到类别。遍历Class的所有成员变量(修改UITextField的占位符文本颜色、字典转换为模型、自动归档和取消归档等)。交换方法实现(方法交换系统)。利用消息转发机制解决无法发现的异常问题。

isa

要了解Runtime,首先要了解其底层的一些常用数据结构,比如isa指针。在arm64架构之前,isa是一个普通的指针,存储Class对象和Meta-Class对象的内存地址。从arm64架构开始,isa进行了优化,变成了union,同时也使用了位域来存储更多的信息。 isa_t源码(objc_class的解释请参考《Objective-C对象本质01——底层实现》):

typedef 无符号长uintptr_t;

联合isa_t {

isa_t() { }

isa_t(uintprt_t 值) : 位(值) { }

类cls;

uintptr_t 位;

//通过掩码获取shiftcls和magic的值。

# 定义ISA_MASK0x0000000ffffffff8ULL

# 定义ISA_MAGIC_MASK0x000003f000000001ULL

# 定义ISA_MAGIC_VALUE0x000001a000000001ULL

结构体{

uintptr_t 非指针: 1;

uintptr_t has_assoc : 1;

uintptr_t has_cxx_dtor : 1;

uintptr_t shiftcls : 33; //MACH_VM_MAX_ADDRESS0x1000000000

uintptr_t 魔法: 6;

uintptr_t 弱引用: 1;

uintptr_t 解除分配: 1;

uintptr_t has_sidetable_rc : 1;

uintptr_t extra_rc : 19;

# 定义RC_ONE (1ULL45)

# 定义RC_HALF (1ULL18)

};

};

isa 位域

nonpointer: 0:表示普通指针,存放Class对象和Meta-Class对象的内存地址。 1:表示开启isa指针优化,使用位域来存储更多信息。 has_assoc:关联对象是否已设置,如果没有,释放会更快。 has_cxx_dtor:是否有C++析构函数(.cxx_destruct),如果没有,释放会更快。 shiftcls:存放Class对象和Meta-Class对象的内存地址。 arm64架构中有33位可以存储地址。根据ISA_MASK,我们可以知道Class对象和Meta-Class对象的内存地址值的最后三位(二进制位)始终为0。 魔法:用户判断对象是否已经初始化。在arm64中,0x16是调试器判断当前对象是否已经初始化的空间。 weakly_referenced:是否已被弱引用指向。如果没有的话,发布会更快。释放:对象是否正在释放内存。 has_sidetable_rc:用于判断对象的引用计数是否太大。如果extra_rc位域无法容纳引用计数,则会将其存储在SideTable属性中。 extra_rc:存储对象的引用计数减一。如果对象的引用计数超过1,则会将其存储在这里。从objc_destructInstance函数中可以看到该对象设置了关联对象或者有C++析构函数,就会进行相应的释放操作。

/******************************************************** ***** **********************

* objc_destructInstance

* 销毁实例而不释放内存。

* 调用C++ 析构函数。

* 调用ARC ivar 清理。

* 删除关联引用。

* 返回`obj`。如果`obj` 为零,则不执行任何操作。

****************************************************** * **********************/

无效* objc_destructInstance(id obj)

{

如果(对象){

//一次读取所有标志以提高性能。

bool cxx=obj-hasCxxDtor();

bool assoc=obj-hasAssociatedObjects();

//这个顺序很重要。

if (cxx) object_cxxDestruct(obj);

if (assoc) _object_remove_associations(obj);

obj-clear解除分配();

}

返回对象;

关于本次高效运行机制揭秘:深度解析第01期和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

用户评论

掉眼泪

这应该是某个软件或项目的版本号吧,还挺酷的。

    有15位网友表示赞同!

服从

不知道这是什么,看起来像个技术名词.

    有15位网友表示赞同!

有一种中毒叫上瘾成咆哮i

好奇这个"Runtime"指的是什么运行环境?

    有17位网友表示赞同!

蔚蓝的天空〃没有我的翅膀

"01"是不是指代第一次发布呀?

    有13位网友表示赞同!

盲从于你

这玩意儿功能强大吗?能用来做什么呢?

    有20位网友表示赞同!

大王派我来巡山!

有没有人用过这款软件?感觉名字很简洁.

    有7位网友表示赞同!

滴在键盘上的泪

我搜了一下,这个Runtime好像是在游戏开发中用的。

    有13位网友表示赞同!

╯念抹浅笑

想知道它有什么改进之处啊,运行速度会更快吗?

    有17位网友表示赞同!

敬情

希望这个Runtime能简化一些开发流程,提高效率!

    有17位网友表示赞同!

不要冷战i

是不是最新的版本号是02呢?会不会有功能更新?

    有11位网友表示赞同!

。婞褔vīp

这名字有点像电脑程序的名字,科技感很强.

    有9位网友表示赞同!

旧爱剩女

我尝试过很多类似的软件,这个品牌怎么样啊?

    有14位网友表示赞同!

凝残月

感觉这个名字很有记忆点,不像其他软件那样枯燥.

    有6位网友表示赞同!

终究会走-

期待下个版本号是什么呢?会不会是01.2?

    有12位网友表示赞同!

三年约

希望这个Runtime能适应各种操作系统,方便使用.

    有6位网友表示赞同!

封锁感觉

这Runtime的中文名字是什么呀?

    有6位网友表示赞同!

有些人,只适合好奇~

有没有详细教程介绍怎么用这个Runtime软件?

    有15位网友表示赞同!

枫无痕

想了解更多关于Runtime的功能和特点。!

    有8位网友表示赞同!

相知相惜

我估计这个Runtime应该很专业吧,适合有一定基础的人使用.

    有18位网友表示赞同!

【高效运行机制揭秘:深度解析第01期】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:临时演员:揭秘影视行业背后的故事 下一篇:2023·秋,东北环线自驾游(10):根河,迎接极寒前的最后时光