不仅仅是指针-(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 pointer
objc_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) |
原文地址。
如果不当请提出,欢迎讨论!