#import <Foundation/Foundation.h> typedef NSArray<NSString *> GLStringArray; typedef NSMutableArray<NSString *> GLStringMutableArray; //@compatibility_alias GLStringMutableArray NSMutableArray<NSString *>; @interface NSObject (GL) //变量 @property (nonatomic, class,readonly) GLStringArray * instanceVarNames; //方法 @property (nonatomic, class,readonly) GLStringArray * instanceMethodNames; @property (nonatomic, class,readonly) GLStringArray * classMethodNames; //属性 @property (nonatomic, class,readonly) GLStringArray * propertyNames; @end
#import "NSObject+GL.h" #import <objc/runtime.h> @implementation NSObject (GL) + (GLStringArray *)instanceVarNames{ unsigned int m = 0; Ivar * ivarList = class_copyIvarList([self class], &m); GLStringMutableArray * array = [[GLStringMutableArray alloc] init]; for (int i = 0; i < m; i ++) { Ivar ivar = ivarList[i]; const char * name = ivar_getName(ivar); NSString * str = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; if (str) { [array addObject:str]; } } return array.copy; } + (GLStringArray *)instanceMethodNames{ return [self gl_methodNamesWithClass:[self class]]; } + (GLStringArray *)classMethodNames{ return [self gl_methodNamesWithClass:object_getClass(self)]; } + (GLStringArray *)propertyNames{ unsigned int m = 0; objc_property_t * propertyList = class_copyPropertyList([self class], &m); GLStringMutableArray * array = [[GLStringMutableArray alloc] init]; for (int i = 0; i < m; i ++) { objc_property_t property = propertyList[i]; const char * name = property_getName(property); NSString * str = [NSString stringWithCString:name encoding:NSUTF8StringEncoding]; if (str) { [array addObject:str]; } } return array.copy; } #pragma mark - private + (GLStringArray *)gl_methodNamesWithClass:(Class)aClass{ unsigned int m = 0; Method * methodList = class_copyMethodList(aClass, &m); GLStringMutableArray * array = [[GLStringMutableArray alloc] init]; for (int i = 0; i < m; i ++) { Method method = methodList[i]; SEL sel = method_getName(method); [array addObject:NSStringFromSelector(sel)]; } return array.copy; } @end