And*_*kha 6 objective-c objective-c-runtime
这是摘录自Objective-C runtime programming guide:
创建新对象时,将分配其内存,并初始化其实例变量.对象变量中的第一个是指向其类结构的指针.这个名为isa的指针使对象可以访问它的类,并通过该类访问它继承的所有类.
isa声明NSObject如下:
Class isa;
Run Code Online (Sandbox Code Playgroud)
反过来Class只不过是指向结构的指针
typedef struct objc_class *Class;
Run Code Online (Sandbox Code Playgroud)
现在让我们来看看这个结构:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,在最新版本的Objective-C中,指向超类的指针(以及结构的所有其余成员除了另一个成员之外)都不可用.
所以我的问题是如果super_class指针不可用,对象如何才能访问其超类?是否可以通过另一个isa指针访问超类?但究竟是怎么回事?这个怎么运作?有人能解释一下吗?
刚检查了源文件
Class class_getSuperclass(Class cls)
{
return _class_getSuperclass(cls);
}
Run Code Online (Sandbox Code Playgroud)
#define newcls(cls) ((class_t *)cls)
Class
_class_getSuperclass(Class cls)
{
return (Class)getSuperclass(newcls(cls));
}
static class_t *
getSuperclass(class_t *cls)
{
if (!cls) return NULL;
return cls->superclass;
}
Run Code Online (Sandbox Code Playgroud)
所以Class实际上是一个指针class_t
typedef struct class_t {
struct class_t *isa;
struct class_t *superclass;
Cache cache;
IMP *vtable;
uintptr_t data_NEVER_USE; // class_rw_t * plus custom rr/alloc flags
class_rw_t *data() const {
return (class_rw_t *)(data_NEVER_USE & ~(uintptr_t)3);
}
void setData(class_rw_t *newData) {
uintptr_t flags = (uintptr_t)data_NEVER_USE & (uintptr_t)3;
data_NEVER_USE = (uintptr_t)newData | flags;
}
bool hasCustomRR() const {
#if CLASS_FAST_FLAGS_VIA_RW_DATA
return data_NEVER_USE & (uintptr_t)1;
#else
return data()->flags & RW_HAS_CUSTOM_RR;
#endif
}
void setHasCustomRR(bool inherited = false);
bool hasCustomAWZ() const {
#if CLASS_FAST_FLAGS_VIA_RW_DATA
return data_NEVER_USE & (uintptr_t)2;
#else
return data()->flags & RW_HAS_CUSTOM_AWZ;
#endif
}
void setHasCustomAWZ(bool inherited = false);
bool isRootClass() const {
return superclass == NULL;
}
bool isRootMetaclass() const {
return isa == this;
}
} class_t;
Run Code Online (Sandbox Code Playgroud)
这是包含所有内容的结构
无论如何,这些都是内部实施细节,不应该依赖.所以不要编写依赖于这些的代码,因为它们可能会在下次运行时更新时中断
| 归档时间: |
|
| 查看次数: |
2083 次 |
| 最近记录: |