使用运行时可以:
Objective-C
#import <objc/runtime.h>
- (void) printClassNames {
int amountClasses = objc_getClassList(NULL, 0);
printf("Amount of classes: %d", amountClasses);
Class *classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * amountClasses);
amountClasses = objc_getClassList(classes, amountClasses);
for (int i = 0; i < amountClasses; i++) {
Class class = classes[i];
if ([NSBundle bundleForClass:class] != [NSBundle mainBundle]) { // restriction that pass classes from main bundle
continue;
}
printf("Class name: %s", class_getName(class));
[self printPropertyNamesForClass:class];
[self printMethodNamesForClass:class];
}
free(classes);
}
- (void) printPropertyNamesForClass:(Class) class {
uint count;
objc_property_t* properties = class_copyPropertyList(class, &count);
for (int i = 0; i < count ; i++) {
const char* propertyName = property_getName(properties[i]);
printf("\t Property name: %s \n", propertyName);
}
free(properties);
}
- (void) printMethodNamesForClass:(Class) class {
//List of all methods
unsigned int amountMethod = 0;
Method *methods = class_copyMethodList(class, &amountMethod);
for (unsigned int i = 0; i < amountMethod; i++) {
Method method = methods[i];
printf("\t method named:'%s' \n", sel_getName(method_getName(method)));
}
free(methods);
}
迅速
func printClassNames() {
let amountClasses = objc_getClassList(nil, 0)
print("Amount of classes: \(amountClasses)")
var classes = [AnyClass](repeating: NSObject.self, count: Int(amountClasses))
classes.withUnsafeMutableBufferPointer { buffer in
let autoreleasingPointer = AutoreleasingUnsafeMutablePointer<AnyClass>(buffer.baseAddress)
objc_getClassList(autoreleasingPointer, amountClasses)
}
for currentClass in classes {
guard Bundle(for: currentClass) == Bundle.main else {continue}
print("Class name:\(currentClass)")
printPropertyNamesForClass(currentClass)
printMethodNamesForClass(currentClass)
}
}
func printPropertyNamesForClass(_ currentClass : AnyClass) {
var count = UInt32()
let propertyList = class_copyPropertyList(currentClass, &count)
let intCount = Int(count)
guard let properties = propertyList, intCount > 0 else {return}
for i in 0 ..< intCount {
let property : objc_property_t = properties[i]
let nameCString = property_getName(property)
print("\t Property name:\(String(cString: nameCString))");
}
free(properties)
}
func printMethodNamesForClass(_ currentClass: AnyClass) {
var methodCount: UInt32 = 0
let methodList = class_copyMethodList(currentClass, &methodCount)
guard let methods = methodList, methodCount > 0 else {return}
var ptr = methods
for _ in 0 ..< methodCount {
let sel = method_getName(ptr.pointee)
ptr = ptr.successor()
let nameCString = sel_getName(sel)
print("\t method named:\(String(cString: nameCString))");
}
}