ios – 获取所有本地类的列表

前端之家收集整理的这篇文章主要介绍了ios – 获取所有本地类的列表前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想获得我已加载到iOS项目中的所有本机类(NSString,NSNumber,int,float,NSSet,NSDictionary).

即,如果我创建了一个名为“TestClass”的自定义类,我不希望它列出…

我已经有了一个代码,但它返回了所有类的名称,我可以修改代码将列表限制为仅限于本机类吗?

  1. #import <objc/runtime.h>
  2. #import <dlfcn.h>
  3. #import <mach-o/ldsyms.h>
  4.  
  5.  
  6. unsigned int count;
  7. const char **classes;
  8. Dl_info info;
  9.  
  10. dladdr(&_mh_execute_header,&info);
  11. classes = objc_copyClassNamesForImage(info.dli_fname,&count);
  12.  
  13. for (int i = 0; i < count; i++) {
  14. NSLog(@"Class name: %s",classes[i]);
  15. Class class = NSClassFromString ([NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding]);
  16. // Do something with class
  17.  
  18. }

解决方法

你会得到所有加载的类
  1. int numClasses;
  2. Class * classes = NULL;
  3.  
  4. classes = NULL;
  5. numClasses = objc_getClassList(NULL,0);
  6.  
  7. if (numClasses > 0 )
  8. {
  9. classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
  10. numClasses = objc_getClassList(classes,numClasses);
  11. for (int i = 0; i < numClasses; i++) {
  12. Class c = classes[i];
  13. NSLog(@"%s",class_getName(c));
  14. }
  15. free(classes);
  16. }

(来自objc_getClassList文档的代码.)

要限制列表,您可以检查从中加载类的包,例如

  1. Class c = classes[i];
  2. NSBundle *b = [NSBundle bundleForClass:c];
  3. if (b != [NSBundle mainBundle])
  4. ...

对于未从您的应用程序加载的所有类.

猜你在找的iOS相关文章