文章目录
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)