美文网首页iOS DeveloperiOS收藏
译文-arm64位isa指针具体含义

译文-arm64位isa指针具体含义

作者: kuperxu | 来源:发表于2016-07-28 17:51 被阅读756次

不仅仅是指针-(Non-pointer isa)

在arm64位下iOS操作系统,Objective-C对象的isa区域不再只是一个指针。

Say what?

如果他不是一个指针,那它是什么?

isa的一些位还编码着指向对象类的指针。但是不管是OSX还是iOS实际上将这64位的地址空间都用上了。Objective-C运行时系统会用这些多余位存储没个对象的一些数据比如他的引用计数(retain count)或者是它是否含有弱引用。

为什么这么改变

性能。重复利用这些没用的位提高运行速度还会减少内存空间。在iOS7关注的是对retain/release 和alloc/dealloc的优化。这一点就做到了这个。

这对我的代码来说意味着什么

不要再直接读取obj->isa。否则编译器会发出警告。编译器是你的朋友。尝试用[obj class]或者object_getClass(obj)代替。
不要直接写obj->isa。用object_setClass()代替。
如果你重写了+allocWithZone:方法,你可能初始化你对象的isa称为一个“未加工”的isa指针。如果你这样做了,将没有多余的数据存储在isa还会导致你调用retain/release缓慢。为了使这些优化有效,使用object_setClass()取代设置isa为0。
如果你重写retain/release去实现一个自定义内置的引用计数,考虑移除这个代码为了支持runtime的自己的实现。iOS 64位模拟器目前不在使用non-pointer isa.需要测试自己的的代码在arm64位真机上。

这对调试来说意味着什么?

调试器知道如何从isa区域解码类。你不需要在很多情况下自己检测他。
你可以设置换将变量OBJC_DISABLE_NONPOINTER_ISA=YES来不使用non-pointer isa对于所有类。如果你代码运行失败在这个变量下,你可能直接不正确的使用了一个isa在一些地方。
如果你自己写一个调试器一样的工具,Objective-C运行时一些接口会帮助你在isa中解码出变量。objc_debug_isa_class_mask描述了哪的位是类指针!用这个公式就可以得到(isa & class_mask) == class pointerobjc_debug_isa_class_mask和objc_debug_isa_magic_value描述了一些位去帮助你区分有效的isa区域还有一些无效的区域:(isa & magic_mask) == magic_value这样获得的isa就是一个未经加工的类指针。这些变量可能在未来改变所以不要在application 代码中使用。

没有任何秘密,其他位是什么意思?

仅仅是娱乐目的。这些值可能会在在未来版本改变。我认为他们已经改变了。。。

名称 说明
1bit indexed 0 is raw isa, 1 is non-pointer isa.
1bit has_assoc Object has or once had an associated reference. Object with no associated references can deallocate faster.
1bit has_cxx_dtor Object has a C++ or ARC destructor. Objects with no destructor can deallocate faster.
30bit shiftcls Class pointer's non-zero bits.
9bit magic Equals 0xd2 Used by the debugger to distinguish real objects from uninitialized junk.
1bit weakly_referenced Object is or once was pointed to by an ARC weak variable. Objects not weakly referenced can deallocate faster.
1bit deallocating Object is currently deallocating
1bit has_sidetable_rc Object's retain count is too large to store inline.
19bit extra_rc Object's retain count above 1. (For example, if extra_rc is 5 then the object's real retain count is 6)

原文地址
如果不当请提出,欢迎讨论!

相关文章

  • 译文-arm64位isa指针具体含义

    不仅仅是指针-(Non-pointer isa) 在arm64位下iOS操作系统,Objective-C对象的is...

  • Runtime(一)

    isa 在arm64 之前,isa就是一个普通的指针,它指向classormeta-class 在arm64之后,...

  • dealloc源码解读

    isa指针 在看dealloc源码之前, 首先要了解isa指针 在arm64架构之前,isa就是一个普通的指针,存...

  • 小码哥底层原理笔记:Runtime之isa指针

    前面我们知道在arm64位之后实例对象的isa指针&ISA_MASK之后是指向class类对象,class类对象的...

  • OC基础 Runtime-isa (3)

    前面我们知道在arm64位之后实例对象的isa指针&ISA_MASK之后是指向class类对象,class类对象的...

  • runtime面试复习

    runtime isa指针的含义 分为指针型isa:isa的値代表Class的地址,非指针型isa :isa的値的...

  • Runtime之isa详解

    isa 概念 isa是相当于是OC对象的一个标识指针,只要是OC对象就一定会有isa指针,arm64之前isa就是...

  • iOS 如何获取真正isa指针的地址

    isa指针 从runtime源码来看:runtime源码 arm64 之后instance获取到class的isa...

  • 【iOS-RunTime系列二】isa指针

    runTime底层的一些常用数据结构,比如isa指针; arm64之前,isa就是一个普通的指针,存储着Class...

  • iOS中的Runtime

    一.isa isa的理解 在arm64架构之前, isa就是一个普通的指针,存储着Class、Meta-Class...

网友评论

    本文标题:译文-arm64位isa指针具体含义

    本文链接:https://www.haomeiwen.com/subject/aivajttx.html