1.动态创建一个类
objc_allocateClassPair(NSObject.class, "NSDog", 0);
//添加/注册一个类
Class NSCat = objc_allocateClassPair(NSObject.class, "NSCat", 0);
objc_registerClassPair(NSCat);
2.获取一个类
//获取class
// Class cls1 = objc_getClass("NSCat");
Class cls1 = objc_getClass("NSDog"); //NSDog 未注册 返回null
NSLog(@"%@",cls1);
3.判断是否元类
//获取metaclass
// Class metacls = objc_getMetaClass("NSCat");
Class metacls = objc_getMetaClass("NSDog"); //NSDog 未注册 返回null
NSLog(@"%@",metacls);
4.查找类
//查找class
//都调用look_up_class(const char *name,
//bool includeUnconnected __attribute__((unused)),
//bool includeClassHandler __attribute__((unused)))
//区别:objc_getClass如果cls没有register,进行检查,objc_lookUpClass不检查
// Class cls2 = objc_lookUpClass("NSCat");
Class cls2 = objc_lookUpClass("NSDog"); //NSDog 未注册 返回null
NSLog(@"%@",cls2);
5.获取class
//和objc_getClass相同,如果没有找到,退出进程'
Class cls3 = objc_getRequiredClass("NSCat");
// Class cls3 = objc_getRequiredClass("NSDog"); //NSDog没有注册,进程中断
NSLog(@"%@",cls3);
- 获取已分配(包含未注册)类的数量
//5.获取已分配(包含未注册)类的数量
int numClasses = 0, newNumClasses = objc_getClassList(NULL, 0); // 1
NSLog(@"%d",newNumClasses);
Class *classes = NULL; // 2
while (numClasses < newNumClasses) { // 3
numClasses = newNumClasses; // 4
classes = (Class *)realloc(classes, sizeof(Class) * numClasses); // 5
newNumClasses = objc_getClassList(classes, numClasses); // 6
for (int i = 0; i < numClasses; i++) { // 7
// NSLog(@"%d->%s",i, class_getName(classes[i])); // 9
} // 10
} // 11
free(classes); // 12
7. 获取已分配(包含未注册)类列表
//6. unsigned int outCount;
Class *classList = objc_copyClassList(&outCount);
for (int i = 0; i < outCount; i++) {
// NSLog(@"%d->%s",i,class_getName( *(classList + i)));
}
free(classList);
8.销毁一个类
// objc_allocateProtocol(<#const char * _Nonnull name#>)
// objc_registerProtocol(<#Protocol * _Nonnull proto#>)
// objc_disposeClassPair(<#Class _Nonnull __unsafe_unretained cls#>)
9.协议相关的
// objc_getProtocol(<#const char * _Nonnull name#>)
// objc_copyProtocolList(<#unsigned int * _Nullable outCount#>)
10.获取镜像(framework or dynamic library)
unsigned int image_count;
const char **images = objc_copyImageNames(&image_count);
for(int i = 0; i < image_count;i++)
{
// NSLog(@"image_%i:%s",i,*(images + i));
}
free(images);
11.获取某个镜像的全部类
const char **class_names = objc_copyClassNamesForImage(class_getImageName(NSNumber.class), &image_count);
for(int i = 0; i < image_count;i++)
{
// NSLog(@"class_names_%i:%s",i,*(class_names + i));
}
12.to learn
// objc_enumerationMutation(id _Nonnull obj)
// objc_setEnumerationMutationHandler(void (* _Nullable handler)(id _Nonnull __strong))
// objc_setForwardHandler(void * _Nonnull fwd, void * _Nonnull fwd_stret)
13.to learn
// objc_loadWeak(id _Nullable __autoreleasing * _Nonnull location)
// objc_storeWeak(id _Nullable __autoreleasing * _Nonnull location, id _Nullable obj)
14.关联对象
// objc_setAssociatedObject(id _Nonnull object, const void * _Nonnull key, id _Nullable value, objc_AssociationPolicy policy)
// objc_getAssociatedObject(id _Nonnull object, const void * _Nonnull key)
// objc_removeAssociatedObjects(id _Nonnull object)
15.to learn
// objc_setHook_getImageName(objc_hook_getImageName _Nonnull newValue, objc_hook_getImageName _Nullable * _Nonnull outOldValue)
// objc_setHook_getClass(objc_hook_getClass _Nonnull newValue, objc_hook_getClass _Nullable * _Nonnull outOldValue)
// objc_setHook_setAssociatedObject(objc_hook_setAssociatedObject _Nonnull newValue, objc_hook_setAssociatedObject _Nullable * _Nonnull outOldValue)
16.to learn
// objc_addLoadImageFunc(objc_func_loadImage _Nonnull func)
99.UNAVAILABLE
//99. Used by Foundation's Key-Value Observing.
// Do not call this function yourself.
// Class _Nonnull
// objc_duplicateClass(Class _Nonnull original, const char * _Nonnull name,
// size_t extraBytes)
//99.
// Class objc_getFutureClass(const char * _Nonnull name)OBJC_ARC_UNAVAILABLE;
// id objc_constructInstance(Class _Nullable cls, void * _Nullable bytes) OBJC_ARC_UNAVAILABLE;
// void * objc_destructInstance(id _Nullable obj)OBJC_ARC_UNAVAILABLE;