iOS源码阅读必备知识之Tagged Pointer

2020-01-21 06:22:36王振洲

对于isa指针的影响

因为tagged pointer 不是一个真正的对象,如果使用isa指针在编译时会报错。

如图:

iOS源码,Tagged,Pointer

提示我们改为object_getClass()

object_getClass()中做了相应的处理

由于object_getClass()没有对应的实现,只能从其他地方窥探一二

objc-weak.mm


weak_read_no_lock(weak_table_t *weak_table, id *referrer_id) 
{
 objc_object **referrer = (objc_object **)referrer_id;
 objc_object *referent = *referrer;
 if (referent->isTaggedPointer()) return (id)referent;
 //...
}

inline bool 
objc_object::isTaggedPointer() 
{
#if SUPPORT_TAGGED_POINTERS
 return ((uintptr_t)this & TAG_MASK);
#else
 return false;
#endif
}

这里取对象的值做了一些判断

如果是tagged pointer , 对象的值就是指针

如果非tagged pointer , 对象的值是指针指向的内存区域中的值

总结