objective-c - Objective-C 中的方法调配

标签 objective-c method-swizzling

我读了一篇 article about "Method Swizzling in Objective-C" .本文中“Method 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]);
}

在文章中,有一句话是

It may seem this this method makes a nonsensical recursive call to itself, but it won’t actually be doing that after we swizzle it.

但是我不是很清楚这个说法,是不是意味着当我们这样写代码的时候:

[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/

关于objective-c - Objective-C 中的方法调配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32432506/

相关文章:

ios swizzle更好理解

ios - UIViewController 方法调整不起作用

ios - Swizzling UIResponder Touch 事件不调用原始方法实现

ios - '通讯错误 : <OS_xpc_error:' while recording video

ios - 创建一个 NSString 的集合/数组以与 stringByReplacingOccurrencesOfString 一起使用

ios - 在理解 typedef 和 block 方面需要帮助

ios - 如何混入 Objective-C 方法的完成 block ?

ios - method_setImplementation() 是原子的吗?

iphone - 通过推送和模态 Segue 重用 View Controller

objective-c - 创建用于写入的空文件?