方法令人费解为什么没有递归

用户名

我正在学习方法混乱。我了解所有内容,并且除了使用此功能外,我都玩过它:

#import <objc/runtime.h>

@implementation UIViewController (Tracking)

+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];

        // When swizzling a class method, use the following:
        // Class class = object_getClass((id)self);

        SEL originalSelector = @selector(viewWillAppear:);
        SEL swizzledSelector = @selector(xxx_viewWillAppear:);

        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)xxx_viewWillAppear:(BOOL)animated {
    [self xxx_viewWillAppear:animated];
    NSLog(@"viewWillAppear: %@", self);
}

@end

来源NSHipster

调用时,目标C如何将这个调用再次解析为原始函数:

[self xxx_viewWillAppear:animated];

因为我们在分配表中混淆了viewWillAppear,所以这是怎么做的?我应该认为它会自我称呼,但事实并非如此。谁能解释这个难题的最后一部分?

尼尔斯城堡

调用时

[self xxx_viewWillAppear:animated];

您不再称呼自己,而是提供了原始的实现

viewWillAppear:animated

当您陷入困境时,这两个实现“切换了位置”。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

令人费解的点击事件:为什么这样的行为?

Javascript 方法链接工作但令人费解

令人费解的地图类型

在SQL中令人费解的超集

错误的基准,令人费解的组装

使用xkbcomp的键盘映射中令人费解的现象

大O-令人费解的while循环时间

用REORDER_TO_FRONT令人费解的行为

JVM(令人费解的)并行处理库/工具

可分类的淘汰赛-令人费解的元素

悬停,z-index和分层...令人费解的混乱?

PHP联合运算符的输出令人费解

具有自动调整单元格大小(estimatedSize)和sectionHeadersPinToVisibleBounds的UICollectionView变得令人费解

PySpark中字符串和空值之间的比较结果令人费解

std :: array聚合初始化需要大量令人费解的花括号

分配给pandas DataFrame中的新列时令人费解的KeyError

大规模搜索和排序,为消除而在Java中进行操作:令人费解的情况

jsfiddle上的z-index示例不起作用,绝对令人费解

升级.Net 3.5到.Net4:MSTEST单元测试失败,出现令人费解的消息

为什么(递归地)调用自身的成员方法没有进入无限循环?

为什么此递归函数没有停止?

为什么scrapy yield.Request() 没有递归?

为什么 Numba 没有改进这个递归函数

为什么这个递归加法没有返回

为什么JS中的递归没有遵循正确的顺序

令人困惑的是,为什么不能喊出虚无的乘客并且没有任何错误

不推荐使用的方法令人困惑

为什么没有getFirst(iterable)方法?

为什么没有涵盖主要方法?