runtime.h-Functions-Obtaining Class Definitions

Obtaining Class Definitions

objc_getClass
OBJC_EXPORT Class _Nullable
objc_getClass(const char * _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

这个就不用说了,用了很多遍了。

objc_getMetaClass
OBJC_EXPORT Class _Nullable
objc_getMetaClass(const char * _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

呦呵,这个方法好,早知道这个方法对于类和对象的理解,用代码去验证元类什么的还是挺方便的。

//NSObject的类对象
Class class_NSObject = [NSObject class];
//NSObject类对象的元类对象
Class metaClass_NSObject = object_getClass(class_NSObject);
//NSObject类对象的元类的元类对象,即根元类对象
Class rootMetaClass_NSObject = object_getClass(metaClass_NSObject);
//NSObject的根元类对象的元类对象
Class root_rootMetaClass_NSObject = object_getClass(rootMetaClass_NSObject);
//这里直接用函数获取元类
Class getNSObjectMetaClass = objc_getMetaClass("NSObject");

//NSObject的类对象地址
NSLog(@"class_NSObject -> %p",class_NSObject);                          // -> 0x1104b8ea8
//NSObject的类对象的元类对象地址
NSLog(@"metaClass_NSObject -> %p",metaClass_NSObject);                  // -> 0x1104b8e58
//NSObject的类对象的元类对象的元类地址
NSLog(@"rootMetaClass_NSObject -> %p",rootMetaClass_NSObject);          // -> 0x1104b8e58
//NSObject的类对象的元类的元类地址
NSLog(@"root_rootMetaClass_NSObject -> %p",root_rootMetaClass_NSObject);// -> 0x1104b8e58
//NSObject的类对象的元类
NSLog(@"getNSObjectMetaClass -> %p",getNSObjectMetaClass);// -> 0x1104b8e58
objc_lookUpClass
OBJC_EXPORT Class _Nullable
objc_lookUpClass(const char * _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

通过类名查找该类并返回,这个看看源码的实现。

Class class = objc_lookUpClass("Person");
NSLog(@"%@",class);// -> Person

Class class1 = objc_getClass("Person");
NSLog(@"%@",class1);// -> Person

objc_lookUpClass与objc_getClass有什么区别呢,这个看函数源码的实现

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

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

底层都是通过另一个函数look_up_class(const char *aClassName, bool includeUnconnected, bool includeClassHandler)来实现的,入参不一样。

objc_getRequiredClass
OBJC_EXPORT Class _Nonnull
objc_getRequiredClass(const char * _Nonnull name)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

函数实现

Class objc_getRequiredClass(const char *aClassName)
{
    Class cls = objc_getClass(aClassName);
    if (!cls) _objc_fatal("link error: class '%s' not found.", aClassName);
    return cls;
}

实际上和objc_getClass函数的调用没啥太大区别,就是多了一步获取不到的提示。

objc_getClassList
OBJC_EXPORT int
objc_getClassList(Class _Nonnull * _Nullable buffer, int bufferCount)
    OBJC_AVAILABLE(10.0, 2.0, 9.0, 1.0, 2.0);

Obtains the list of registered class definitions获取已经注册了的类的列表

这个开发过程中基本上用不到吧,有什么使用场景吗?

静态库/动态库里的未暴露的文件可以用这个方法来获取吗?这个在开发中有什么实际的用途呢?

这是些资料
objc_getClassList(:😃
Runtime-objc_getClassList
使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类
runtime使用篇: objc_getClassList 和 objc_copyClassList

这个还是再探究探究。

objc_copyClassList
OBJC_EXPORT Class _Nonnull * _Nullable
objc_copyClassList(unsigned int * _Nullable outCount)
    OBJC_AVAILABLE(10.7, 3.1, 9.0, 1.0, 2.0);

底层的实现和objc_getClassList用的同一个方法static Class * objc_copyRealizedClassList_nolock(unsigned int *outCount)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值