获取所有本机类的列表
我想获得我已加载到iOS项目中的所有本机类(NSString,NSNumber,int,float,NSSet,NSDictionary)。
即,如果我创建了一个名为“TestClass”的自定义类,我不希望它列出…
我已经有了一个代码,但它返回了所有类的名称,我可以修改代码,只将列表限制为Native类?
#import #import #import unsigned int count; const char **classes; Dl_info info; dladdr(&_mh_execute_header, &info); classes = objc_copyClassNamesForImage(info.dli_fname, &count); for (int i = 0; i < count; i++) { NSLog(@"Class name: %s", classes[i]); Class class = NSClassFromString ([NSString stringWithCString:classes[i] encoding:NSUTF8StringEncoding]); // Do something with class }
您将获得所有已加载的类
int numClasses; Class * classes = NULL; classes = NULL; numClasses = objc_getClassList(NULL, 0); if (numClasses > 0 ) { classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses); numClasses = objc_getClassList(classes, numClasses); for (int i = 0; i < numClasses; i++) { Class c = classes[i]; NSLog(@"%s", class_getName(c)); } free(classes); }
(来自objc_getClassList文档的代码。)
要限制列表,可以检查从中加载类的包 ,例如
Class c = classes[i]; NSBundle *b = [NSBundle bundleForClass:c]; if (b != [NSBundle mainBundle]) ...
对于未从您的应用程序加载的所有类。
这是Swift 3的纯Swift解决方案:
var numClasses: Int32 = 0 var allClasses: AutoreleasingUnsafeMutablePointer? = nil defer { allClasses = nil } numClasses = objc_getClassList(nil, 0) if numClasses > 0 { var ptr = UnsafeMutablePointer.allocate(capacity: Int(numClasses)) defer { ptr.deinitialize() ptr.deallocate(capacity: Int(numClasses)) } allClasses = AutoreleasingUnsafeMutablePointer(ptr) numClasses = objc_getClassList(allClasses, numClasses) for i in 0 ..< numClasses { if let currentClass: AnyClass = allClasses?[Int(i)] { print("\(currentClass)") } } }
使用Swift 2.2 / Xcode 7.3的原始解决方案:
var numClasses: Int32 = 0 var allClasses: AutoreleasingUnsafeMutablePointer = nil defer { allClasses = nil } numClasses = objc_getClassList(nil, 0) if numClasses > 0 { var ptr = UnsafeMutablePointer.alloc(Int(numClasses)) defer { ptr.destroy() ptr.dealloc(Int(numClasses)) ptr = nil } allClasses = AutoreleasingUnsafeMutablePointer.init(ptr) numClasses = objc_getClassList(allClasses, numClasses) for i in 0 ..< numClasses { if let currentClass: AnyClass = allClasses[Int(i)] { print("\(currentClass)") } } }
请注意,由于Swift处理弱指针的方式(protip:它没有),你的类将被这个代码过度释放。 我打开了SR-1068关于桥接__weak
和__unsafe_unretained
指向Swift的指针。 __weak
指针被桥接为UnsafeMutablePointer
而__unsafe_unretained
指针被桥接为AutoreleasingUnsafeMutablePointer
,这会导致overrelase。
幸运的是, Classes在发布时没有做任何事情 ,所以这段代码相对安全,至少目前如此。
- startMonitoringForRegion实际上是否工作?
- 使用Swift以编程方式布局视图的另一种方法
- Swift 3:DispatchQueue.main.async {}和DispatcQueue.main.async之间的区别(execute:{})?
- Swift中的本地化 – 即使应用程序有更多语言,也可以将应用程序限制为一种语言
- 尝试将内联UIDatePicker添加到UITableViewCell
- 有什么地方我可以启动MobileSubstrate调整编程?
- React Native:处理多个数字input
- Xcode中的Info.plist文件
- 使用故事板中设置的标识符获取对NSLayoutConstraint的引用