使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类
一、介绍
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
使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类的更多相关文章
- 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型
我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...
- Runtime获取类的属性列表和方法列表
Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...
- swift3.0 运行时获取类的属性
//定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Java 反射(二)运行时获取类的信息
目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...
- java获取类的信息
关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...
- PHP反射获取类中的所有常量
<?php// Yii 2// namespace yournamespace;// use Yii; /** * 缓存辅助类 */ class CacheHelper { /** * 缓存键 ...
- C#获取类以及类下的方法(用于Asp.Net MVC)
在C#中,实现动态获取类和方法主要通过反射来实现,要引用System.Reflection. public ActionResult GetControllerAndAction() List< ...
- c#通过反射获取类上的自定义特性
c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...
随机推荐
- centos7设置静态ip-修改配置文件方式
修改IP地址为静态地址需要修改配置文件,首先打开配置文件,在控制台输入cd /etc/sysconfig/network-scripts 输入ifconfig,这样就可以看到你的ip地址等信息了. v ...
- 加权无向图 最小生成树 Prim算法 延迟版和即时版 村里修路该先修哪
本次要解决的问题是:你们村里那些坑坑洼洼的路,到底哪些路才是主干道? 小明:肯定是哪里都能到得了,并且去哪里都相对比较近,并且被大家共用程度高的路是啊! 具体是哪几条路呢?今天就可以给出准确答案 最小 ...
- celery配置
celery配置 celery的官方文档其实相对还是写的很不错的.但是在一些深层次的使用上面却显得杂乱甚至就没有某些方面的介绍, 通过我的一个测试环境的settings.py来说明一些使用celery ...
- Think in Java 笔记(chapter1-7)
Content Chapter 1:对象导论 Chapter 2:一切都是对象 Chapter 3:操作符 Chapter 4:控制执行流程 Chapter 5:初始化与清理 Chapter 6:访问 ...
- (day65、66)Vue基础、指令、实例成员、JS函数this补充、冒泡排序
目录 一.Vue基础 (一)什么是Vue (二)为什么学习Vue (三)如何使用Vue 二.Vue指令 (一)文本指令 (二)事件指令v-on (三)属性指令v-bind (四)表单指令v-model ...
- adb devices无法连接mumu模拟器
解决方案: 如果你的android环境能够直接访问 adb 的相关指令.只需要把mumu模拟器打开 然后打开cmd -> 输入 adb connect 127.0.0.1:7555 就能直接连上 ...
- easyui treegrid数据重复加载问题
在使用easyui的时候,出现了数据重复加载的问题.如下图 关于这个问题有两种说法,第一种说法是 easyui-datagrid 类在html和js中重复定义,数据渲染时会加载两次.另一种是$(&qu ...
- PHP 将某个http地址的远程图片下载到本地的某个目录
代码: function getImage($url,$save_dir='',$filename='',$type=0){ if(trim($url)==''){ return array('fil ...
- 一文带你深入浅出Spring 事务原理
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获 ...
- jquery选择器之模糊匹配
模糊匹配主要分为前导模糊匹配,后导模糊匹配和全文模糊匹配. 前导模糊匹配[^=] 例子:选择name前缀为aa的所有div的jQuery对象. $("div[name^='aa']" ...