ios objc_getClass 和 objc_lookUpClass 有什么区别

liu*_*liu 5 runtime ios

Apple\xe2\x80\x99s 的解释是

\n\n
\n

objc_getClass不同之处在于 objc_lookUpClass,如果类未注册, objc_getClass则调用类处理程序回调,然后再次检查该类是否已注册。 objc_lookUpClass不调用类处理程序回调。

\n
\n\n

但我不太理解“类处理程序回调”。你能更详细地解释一下吗?我希望一些代码可以显示它们的差异\xef\xbc\x8c非常感谢!

\n

小智 3

Apple 文档中对这两种方法的解释不清楚,但 Objective C 运行时代码是开源的,可以从Apple Opensource获取。

这两种方法的实现是:

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);
}
Run Code Online (Sandbox Code Playgroud)

这两个方法都委托给look_up_class方法,最后一个参数具有不同的参数includeClassHandler

但是看看我们的实现look_up_class,我们可以看到最后两个参数实际上根本没有被使用!

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;
}
Run Code Online (Sandbox Code Playgroud)

因此,总而言之,objc_getClass和 的objc_lookUpClass行为都是相同的。