一、介绍

objc_copyClassNamesForImage:拷贝动态库类列表,也即当前工程下自己创建的所有类

objc_getClassList:获取所有类列表,也即当前工程下所有类(含系统类、cocoPods类)

二、代码

//  NSBundle+XYQInfomation.m
// 运行时
#import "NSBundle+XYQInfomation.h"
#import <objc/runtime.h> #import <dlfcn.h> /// 动态链接库头文件
#import <mach-o/ldsyms.h> ///内核动态系统库头文件 @implementation NSBundle (XYQInfomation) ///获取当前工程下自己创建的所有类
+ (NSArray <Class> *)xyq_bundleOwnClassesInfo { NSMutableArray *resultArray = [NSMutableArray array]; unsigned int classCount;
const char **classes;
Dl_info info; ///_mh_execute_header : mach-o头部的地址
///dladdr: 获取app的路径
dladdr(&_mh_execute_header, &info); ///拷贝动态库类列表
classes = objc_copyClassNamesForImage(info.dli_fname, &classCount); dispatch_semaphore_t semaphore = dispatch_semaphore_create();///创建信号
dispatch_apply(classCount, dispatch_get_global_queue(, ), ^(size_t index) { ///遍历
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);///信号加锁
NSString *className = [NSString stringWithCString:classes[index] encoding:NSUTF8StringEncoding];
Class class = NSClassFromString(className);
[resultArray addObject:class];
dispatch_semaphore_signal(semaphore);///信号释放锁
}); ///释放内存
free(classes); return resultArray.mutableCopy;
} ///获取当前工程下所有类(含系统类、cocoPods类)
+ (NSArray <NSString *> *)xyq_bundleAllClassesInfo { NSMutableArray *resultArray = [NSMutableArray new]; ///获取所有类
int classCount = objc_getClassList(NULL, ); ///分配内存
Class *classes = NULL;
classes = (__unsafe_unretained Class *)malloc(sizeof(Class) *classCount); ///获取所有类
classCount = objc_getClassList(classes, classCount); dispatch_semaphore_t semaphore = dispatch_semaphore_create();///创建信号
dispatch_apply(classCount, dispatch_get_global_queue(, ), ^(size_t index) { ///遍历
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); ///信号加锁
Class class = classes[index];
NSString *className = [[NSString alloc] initWithUTF8String: class_getName(class)];
[resultArray addObject:className];
dispatch_semaphore_signal(semaphore);///信号释放锁
}); ///释放内存
free(classes); return resultArray.mutableCopy;
}

三、演示

测试:

-(void)test_Objc_GetClassList {

    //全部类
//NSArray *classes = [NSBundle xyq_bundleAllClassesInfo]; //自定义类
NSArray *classes = [NSBundle xyq_bundleOwnClassesInfo];
for (NSString *className in classes) {
NSLog(@"className = %@",className);
}
}

结果:

-- ::43.443258+ 运行时[:] className = Person
-- ::43.443411+ 运行时[:] className = TestObject
-- ::43.443514+ 运行时[:] className = ViewController
-- ::43.443599+ 运行时[:] className = DataTableViewController
-- ::43.443687+ 运行时[:] className = Student
-- ::43.443771+ 运行时[:] className = AppDelegate
-- ::43.443883+ 运行时[:] className = NoDataEmptyView

最新文章

  1. linux 下安装web开发环境
  2. 1 为什么搭建.Net core下的云开发框架
  3. Java中如何克隆集合——ArrayList和HashSet深拷贝
  4. Delphi QC 记录
  5. [小北De编程手记] : Lesson 01 - Selenium For C# 之 环境搭建
  6. php--在apache上配制rewrite重写
  7. LeetCode Single Number II 单元素2
  8. HTML5 indexedDB数据库的入门学习(一)
  9. hdu2565java
  10. Android项目Tab类型主界面大总结 Fragment+TabPageIndicator+ViewPager
  11. 梯田(dfs)
  12. 【Eclipse Plugin】SonarQube 启动报错
  13. .NET 利用反射将对象数据添加到数据库
  14. angularjs 动态显示内容适用于$modal
  15. RabbitMQ --- Work Queues(工作队列)
  16. golang 栈操作
  17. ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题
  18. Apache shiro集群实现 (三)shiro身份认证(Shiro Authentication)
  19. 再见,Python!你好,Go语言
  20. WEB API系列(一):WEB API的适用场景、第一个实例

热门文章

  1. iOS字符串处理_替换(去掉空格换行)、截取
  2. TCP/IP网络协议初识
  3. SqlServer性能优化,查看CPU、内存占用大的会话及SQL语句
  4. Linux_更改时区和利用Crontab同步时间
  5. 用python暴力破解压缩文件并不是万能,至少这个场景我告诉你密码你用代码也破解不了
  6. 《HTTPS权威指南》读书笔记——PKI
  7. 《HTTPS权威指南》读书笔记——SSL/TLS协议
  8. BITCTF-MISC
  9. Java IO系列之 ByteArrayInputStream
  10. (day65、66)Vue基础、指令、实例成员、JS函数this补充、冒泡排序