一道值得深入思考的iOS面试题详解

2020-01-21 07:53:19刘景俊

我们需要做的就是分析为什么能成功。

为什么调用不崩溃

我们需要了解,cls的意思。

cls在C语言里,就是一个指针,这个指针的内容指向Spark类

当我们通过void *obj = &cls;这个语句执行后,获取的就是一个指向这个指针cls的指针

事实上在这一步操作实现后,obj 这个指针就已经具有Object-c对象的功能了,为什么呢?接下来我们可以看看runtime实现原理了,这里我只说一点


//对象
struct objc_object {
 Class isa OBJC_ISA_AVAILABILITY;
};
//类 
struct objc_class {
 Class isa OBJC_ISA_AVAILABILITY;
#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
} OBJC2_UNAVAILABLE;
//方法列表
struct objc_method_list {
 struct objc_method_list *obsolete   OBJC2_UNAVAILABLE;
 int method_count      OBJC2_UNAVAILABLE;
#ifdef __LP64__
 int space      OBJC2_UNAVAILABLE;
#endif
 /* variable length structure */
 struct objc_method method_list[1]   OBJC2_UNAVAILABLE;
}        OBJC2_UNAVAILABLE;
//方法
struct objc_method {
 SEL method_name      OBJC2_UNAVAILABLE;
 char *method_types     OBJC2_UNAVAILABLE;
 IMP method_imp      OBJC2_UNAVAILABLE;
}

 

上述简介中部分是错误的,因为这个只是在<objc/runtime.h>中的显示,但是觉得直接删除又显现不出更改。因而在此专门写出,我会在下面给出正确的解释与数据来源