今天有同事遇到问题,他重写viewDidAppear:方法,但是,代码并没有执行到。后来我发现,是另个一同事用了黑魔法搞的鬼,而且他本人并不知道这么做会产生影响。(本文中所有黑魔法指Swizzle)
我展示下hook的代码
[self aspect_hookSelector:@selector(viewDidAppear:) withOptions:AspectPositionBefore usingBlock:^(id<AspectInfo> info, BOOL animated) {
UIViewController *vc = [info instance];
[vc AspectBeforeViewDidAppear:animated];
} error:&error];
error = nil;
[self aspect_hookSelector:@selector(viewDidAppear:) withOptions:AspectPositionAfter usingBlock:^(id<AspectInfo> info, BOOL animated) {
UIViewController *vc = [info instance];
[vc AspectAfterViewDidAppear:animated];
} error:&error];
作者的原意是想在viewDidAppear:执行过程中,在前面执行一些代码,在后面也执行一些代码。魔法的可怕之处来了:难以操控。
明白了需求,看看到底问题出在了哪里
先做如下指代原函数viewDidAppear:为SEL1,其实现IMP1
原函数执行后的函数SEL3——>IMP3(SEL3)