打印Objective-C对象中的任何方法
+ (void)logMethodWithClass:(Class)aClass
condition:(BOOL(^)(SEL sel))condition
before:(void(^)(id target, SEL sel))before
after:(void(^)(id target, SEL sel))after;
aClass:目标类
condition:是否打印某个方法
before:某个方法调用前
before:某个方法调用后
1.打印一个类的所有方法:
[ANYMethodLog logMethodWithClass:[UIViewController class] condition:^BOOL(SEL sel) {
NSLog(@"method:%@", NSStringFromSelector(sel));
return NO;
} before:nil after:nil];
2.追踪方法的调用栈,并且可以只追踪限定的方法:
[ANYMethodLog logMethodWithClass:[UIViewController class] condition:^BOOL(SEL sel) {
NSArray *whiteList = @[@"loadView", @"viewDidLoad", @"viewWillAppear:", @"viewDidAppear:", @"viewWillDisappear:", @"viewDidDisappear:", @"viewWillLayoutSubviews", @"viewDidLayoutSubviews"];
return [whiteList containsObject:NSStringFromSelector(sel)];
} before:^(id target, SEL sel) {
NSLog(@"before target:%@ sel:%@", target, NSStringFromSelector(sel));
} after:^(id target, SEL sel) {
NSLog(@"after target:%@ sel:%@", target, NSStringFromSelector(sel));
}];
3.观察某个方法调用前与调用后的变化:
[ANYMethodLog logMethodWithClass:[ListController class] condition:^BOOL(SEL sel) {
return [NSStringFromSelector(sel) isEqualToString:@"viewDidLoad"];
} before:^(id target, SEL sel) {
NSLog(@"before frame%@", NSStringFromCGRect([(ListController *)target view].frame));
} after:^(id target, SEL sel) {
NSLog(@"after frame%@", NSStringFromCGRect([(ListController *)target view].frame));
}];
- 解决真机上运行出现的问题。
- 打印调用时的参数值。
- 打印返回值。
- 计算某个方法的耗时。
利用runtime交换方法的实现。动态创建新方法,在新方法里再调用原来的方法。现阶段还不是很完美地调用原来方法,在需要传参的方法会出现传参失败,在真机问题较多,在模拟器问题较少,在用的时候可以过滤掉需要传参的方法,欢迎提Issues和Pull requests。