今天有同事遇到問題,他重寫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)