我已经为 s 实现了一个 Swizzling 类别,当它们出现时UIViewController
,它就是s:NSlog
#import "UIViewController+Logger.h"
#import <objc/runtime.h>
@implementation UIViewController (Logger)
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(presentViewController:animated:completion:);
SEL swizzledSelector = @selector(logAndPresentViewController:animated:completion:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod) {
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
#pragma mark - Method Swizzling
- (void)logAndPresentViewController:(UIViewController *)viewControllerToPresent
animated:(BOOL)flag
completion:(void (^)(void))completion {
NSLog(@"viewControllerToPresent: %@", viewControllerToPresent);
[self logAndPresentViewController:viewControllerToPresent animated:flag completion:completion];
}
@end
显然,这仅在 swizzled 应用程序内工作正常,但我想知道我是否也可以“挂钩”共享presentViewController
,以便在我的应用程序外部呈现视图时调用它。我在想也许可以UIViewController
动态加载dlopen
而不是获取指向它的全局图像符号的指针。可能吗?如果不是——不是吗?
免责声明 - 我这样做是为了在我自己的开发设备上进行调试,并且不会将应用程序上传到 App Store。