runtime 笔记
获取类的所有属性和变量 class_copyIvarList
#import <objc/runtime.h>
@interface UIViewController () {
int num; // 写在这里的都是变量
}
@end
/// property 用该关键字定义的都属于属性
@property (nonatomic, copy) NSString *name;
@property (nonatomic, strong) UIView *rootView;
@implementation UIViewController
- (void)viewDidLoad {
[super viewDidLoad];
unsigned int count = 0;
Ivar *ivarList = class_copyIvarList(self.class, &count);
for (int i = 0; i < count; i ++) {
Ivar ivar = ivarList[i];
NSString *ivarName = [NSString stringWithUTF8String:ivar_getName(ivar)];
LLog(@"%@",ivarName);
}
free(ivarList); /// 使用copy的需要释放一下
}
输出结果:
Cls:UIViewController.m:(49) num
Cls:UIViewController.m:(49) _name
Cls:UIViewController.m:(49) _rootView
获取所有属性 class_copyPropertyList
unsigned int count = 0;
objc_property_t *properts = class_copyPropertyList(self.class, &count);
for (int i = 0; i < count; i++) {
objc_property_t property = properts[i];
NSString *pName = [[NSString alloc] initWithCString:property_getName(property) encoding:(NSUTF8StringEncoding)];
NSLog(@"%@",pName);
}
free(properts);
输出结果:
MJApp[987:250406] name
MJApp[987:250406] rootView
获取类中的所有方法 class_copyMethodList
Method *mList = class_copyMethodList(self.class, &count);
for (int i = 0; i < count; i++) {
NSLog(@"%s",sel_getName(method_getName(mList[i])));
}
free(mList);
输出结果:
MJApp[993:251372] .cxx_destruct
MJApp[993:251372] setName:
MJApp[993:251372] name
MJApp[993:251372] viewDidLoad
MJApp[993:251372] rootView
MJApp[993:251372] setRootView:
属性自动生成set、get方法。