一、介绍

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获取类的更多相关文章

  1. 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

    我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...

  2. Runtime获取类的属性列表和方法列表

    Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...

  3. swift3.0 运行时获取类的属性

    //定义Person类 class Person: NSObject { var name: String? //注意这里基本数据类型我定义的是必选属性 var age: Int = override ...

  4. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

  5. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  6. java获取类的信息

    关键技术剖析 1.java.lang.reflect包实现了java的反射机制,在使用反射机制时,需要导入该包. 2.Class类的forName方法能够根据类名加载类,获得类的Class对象. Cl ...

  7. PHP反射获取类中的所有常量

    <?php// Yii 2// namespace yournamespace;// use Yii; /** * 缓存辅助类 */ class CacheHelper { /** * 缓存键 ...

  8. C#获取类以及类下的方法(用于Asp.Net MVC)

    在C#中,实现动态获取类和方法主要通过反射来实现,要引用System.Reflection. public ActionResult GetControllerAndAction() List< ...

  9. c#通过反射获取类上的自定义特性

    c#通过反射获取类上的自定义特性 本文转载:http://www.cnblogs.com/jeffwongishandsome/archive/2009/11/18/1602825.html 下面这个 ...

随机推荐

  1. Pinpoint-agent监控springboot编译的jar启动方式

    由于springboot在打包发版时已经将tomcat容器内嵌到jar文件中,可以通过以下命令来使pinpoint-agent监控生成的jar服务 java -javaagent:D:\Softwar ...

  2. SQL Server通过条件搜索获取相关的存储过程等对象

    在SQL Server中,我们经常遇到一些需求,需要去搜索存储过程(Procedure).函数(Function)等对象是否包含某个对象或涉及某个对象,例如,我需要查找那些存储过程.函数是否调用了链接 ...

  3. ORM映射(对象关系映射)

    ORM映射(对象关系映射)分创建表和操作表两个部分创建单表创建关联表(foreignKey) 一对一 一对多(重点) 多对多(重点) 创建表后加str方法把打印的地址转换成对应字符表的操作(增删改查) ...

  4. Unity《ATD》塔防RPG类3D游戏架构设计(一)

    目录 <ATD> 游戏简介 <ATD> 整体结构 <ATD> 游戏机制 Buff机制 Skill机制(技能机制) 仇恨机制 <ATD> 游戏模型 策划案 ...

  5. 数组类的创建——StaticArray.h

    创建好的基于顺序存储结构的线性表存在两个方面的问题:1)功能上的问题:数组操作符的重载带来的问题,有可能线性表被无用为数组了,线性表被当做数组来使用了.2)效率方面的问题 本篇博客就要解决功能上的问题 ...

  6. EEPROM的概念接口类型及软件实例

    基本概念 EEPROM的全称是“电可擦除可编程只读存储器”,即Electrically Erasable Programmable Read-Only Memory.是相对于紫外擦除的rom来讲的.但 ...

  7. 利用Python进行数据分析-Pandas(第二部分)

    上一个章节中我们主要是介绍了pandas两种数据类型的具体属性,这个章节主要介绍操作Series和DataFrame中的数据的基本手段. 一.基本功能 1.重新索引 pandas对象的一个重要方法是r ...

  8. ETCD:配置参数

    原文地址:Configuration flags etcd通过配置文件,多命令行参数和环境变量进行配置, 可重用的配置文件是YAML文件,其名称和值由一个或多个下面描述的命令行标志组成.为了使用此文件 ...

  9. WebShell代码分析溯源(三)

    WebShell代码分析溯源(三) 一.一句话变形马样本 <?php $g = array('','s');$gg = a.$g[1].ser.chr('116');@$gg($_POST[ge ...

  10. js中scroll滚动相关

    js中scroll滚动相关 scroll,滚动,一般讨论的是网页整体与浏览器之间的关系. 一.元素相关 属性/方法 解释 element.scrollHeight 返回元素的整体高度. element ...