2016-12-17 375 views
2

苹果的解释是IOS是什么objc_getClass和objc_lookUpClass的区别

objc_getClass是在objc_lookUpClass不同,如果类没有注册,objc_getClass调用类的处理程序回调,然后检查第二次,看是否该课程已注册。 objc_lookUpClass不调用类处理程序回调。

但我不太了解“类处理程序回调”。你能详细解释一下吗?我希望有些代码能够展示它们的差异,非常感谢!

回答

0

他们拖拽的方法说明在苹果的文档中不明确。但运行代码在Apple Opensource中运行。 根据运行时的oppensource,我发现他们如下二方法FPGA实现:

Class objc_getClass(const char *aClassName) 
{ 
    if (!aClassName) return Nil; 

    // NO unconnected, YES class handler 
    return look_up_class(aClassName, NO, YES); 
} 

Class objc_lookUpClass(const char *aClassName) 
{ 
    if (!aClassName) return Nil; 

    // NO unconnected, NO class handler 
    return look_up_class(aClassName, NO, NO); 
} 

他们拖方法都调用了look_up_class方法,在最后一个参数不同。在look_up_class内部,最后一个参数不使用。因此,总之,我认为objc_getClassobjc_lookUpClass都是一样的。

Class 
look_up_class(const char *name, 
       bool includeUnconnected __attribute__((unused)), 
       bool includeClassHandler __attribute__((unused))) 
{ 
    if (!name) return nil; 

    Class result; 
    bool unrealized; 
    { 
     rwlock_reader_t lock(runtimeLock); 
     result = getClass(name); 
     unrealized = result && !result->isRealized(); 
    } 
    if (unrealized) { 
     rwlock_writer_t lock(runtimeLock); 
     realizeClass(result); 
    } 
    return result; 
}