Objective-C中的方法Swizzling
我读了一篇关于“Objective-C中的方法Swizzling”的文章 。 在这篇文章中,“方法Swizzing”的含义是交换两种方法的实现。 示例如下所示:
- (void) logged_viewDidAppear:(BOOL)animated { [self logged_viewDidAppear:animated]; NSLog(@"logged view did appear for %@", [self class]); } + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewWillAppearSelector = @selector(viewDidAppear:); SEL viewWillAppearLoggerSelector = @selector(logged_viewDidAppear:); Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector); Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void) logged_viewDidAppear:(BOOL)animated { [self logged_viewDidAppear:animated]; NSLog(@"logged view did appear for %@", [self class]); }
在这篇文章中,一句话是
看起来这个方法对自己做了一个无意义的recursion调用,但是在我们调用它之后,实际上并不会这样做。
但是我不是很清楚这个说法,是不是说我们编写如下的代码:
[self viewDidAppear],
因为它的实现变成了“logged_viewDidAppear”,所以程序进入方法“logged_viewDidAppear”,在这个方法中,我们可以看到,第一行是[self logged_viewDidAppear:animated]; 出于同样的原因,该方法变成“viewDidAppear”。 我的话是正确的吗?
是的。 当调用viewDidAppear时,它实际上会在运行时被调用到logged_viewDidAppear的实现上,所以被调用的时候也会调用logged_viewDidApear。
检查这个: http : //nshipster.com/method-swizzling/和这个https://www.bignerdranch.com/blog/inside-the-bracket-part-7-runtime-machinations/