大家好,今天小编来为大家解答高效运行机制揭秘:深度解析第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期和的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。
【高效运行机制揭秘:深度解析第01期】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
这应该是某个软件或项目的版本号吧,还挺酷的。
有15位网友表示赞同!
不知道这是什么,看起来像个技术名词.
有15位网友表示赞同!
好奇这个"Runtime"指的是什么运行环境?
有17位网友表示赞同!
"01"是不是指代第一次发布呀?
有13位网友表示赞同!
这玩意儿功能强大吗?能用来做什么呢?
有20位网友表示赞同!
有没有人用过这款软件?感觉名字很简洁.
有7位网友表示赞同!
我搜了一下,这个Runtime好像是在游戏开发中用的。
有13位网友表示赞同!
想知道它有什么改进之处啊,运行速度会更快吗?
有17位网友表示赞同!
希望这个Runtime能简化一些开发流程,提高效率!
有17位网友表示赞同!
是不是最新的版本号是02呢?会不会有功能更新?
有11位网友表示赞同!
这名字有点像电脑程序的名字,科技感很强.
有9位网友表示赞同!
我尝试过很多类似的软件,这个品牌怎么样啊?
有14位网友表示赞同!
感觉这个名字很有记忆点,不像其他软件那样枯燥.
有6位网友表示赞同!
期待下个版本号是什么呢?会不会是01.2?
有12位网友表示赞同!
希望这个Runtime能适应各种操作系统,方便使用.
有6位网友表示赞同!
这Runtime的中文名字是什么呀?
有6位网友表示赞同!
有没有详细教程介绍怎么用这个Runtime软件?
有15位网友表示赞同!
想了解更多关于Runtime的功能和特点。!
有8位网友表示赞同!
我估计这个Runtime应该很专业吧,适合有一定基础的人使用.
有18位网友表示赞同!