美文网首页iOS
iOS调用不存在的方法

iOS调用不存在的方法

作者: 码农二哥 | 来源:发表于2020-03-22 08:12 被阅读0次

问题

  • iOS调用不存在的方法时,会发生crash,请问crash发生在什么阶段,这个问题该如何作答呢?
    • 方法查找阶段?
    • 消息转发阶段中?
    • 消息转发阶段之后?
    • 还是其它什么地方?

场景

我们知道,在oc中,当我们调用一个类中不存在的方法,会发生crash,错误信息大概是这样做:


image.png

预备

问题:

  • 用心看这个crash信息,你想到什么?

打断点摸索一下

首先:

// 调用一个不存在的方法
[self performSelector:@selector(aaa:)];

第二:

image.png

第三:

image.png

第四:

image.png

问题:

如果在类中对这两个方法这样重写,猜猜看forwardInvocation会被调用么?想想为什么?

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    if ([anInvocation selector] == @selector(jump)) {
        Monkey *monkey = [[Monkey alloc] init];
        [anInvocation invokeWithTarget:monkey];
    }
    [super forwardInvocation:anInvocation];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if (aSelector == @selector(jump)) {
        return [NSMethodSignature signatureWithObjCTypes:"V@:@"];
    }
    return [super methodSignatureForSelector:aSelector];
}

第五:

image.png

forwardInvocation中的断点并没有走到,而是直接doesNotRecognizeSelector了。找个理由解释一下?

NSObject中doesNotRecognizeSelector的默认实现类似如下代码:

// Replaced by CF (throws an NSException)
+ (void)doesNotRecognizeSelector:(SEL)sel {
    _objc_fatal("+[%s %s]: unrecognized selector sent to instance %p", 
                class_getName(self), sel_getName(sel), self);
}

那么是不是可以理解为:我在子类重写doesNotRecognizeSelector方法,不调用[super ]就不会crash了呢?


image.png

实际测试一下,依然会crash,想想为什么呢?欢迎吐槽抛抛出来的问题。

官方文档

相关文章

  • iOS调用不存在的方法

    问题 iOS调用不存在的方法时,会发生crash,请问crash发生在什么阶段,这个问题该如何作答呢?方法查找阶段...

  • iOS动态调用类方法

    iOS动态调用类方法(不带参数) iOS动态调用类方法(带参数) iOS动态调用类方法(有返回值) 优点 弱化连接...

  • 消息转发机制

    为什么说 OC 的动态的 严格来说iOS中不存在方法调用的说法,应该说是消息的传递。消息传递和函数调用的区别就是,...

  • python __getattr__

    __getattr__ 这是python里的一个内建函数,当调用的属性或者方法不存在时,该方法会被调用 调用不存在...

  • h5与安卓,ios交互

    调用ios方法并传值 1、首先判断是不是ios手机 2、将ios方法进行封装并在页面调用传值即可 ios调用h5的...

  • RN 调用原生方法(iOS)、原生(iOS)调用RN方法

    RN 调用原生方法(iOS) RN使用 原生(iOS)调用RN方法 原生使用[SendEventManager e...

  • php对象方法链式调用

    对象方法链式操作 魔法函数 __call(args)对象调用不存在的方法的时候,会自动调用 调用函数的方法 cal...

  • iOS和HTML相互调用

    在iOS中调用HTML iOS中调用HTML借助WebView来显示 方法: 在HTML中调用iOS 在webVi...

  • Unity与iOS交互

    一、概要 本篇文章主要介绍Unity调用iOS方法,以及iOS调用Unity方法,回传信息。暂不涉及iOS集成第三...

  • Vue和ios、android交互通信

    1)原生调用Vue方法 Vue代码 ios调用代码 android调用代码 2)Vue调用原生方法 vue调用代码...

网友评论

    本文标题:iOS调用不存在的方法

    本文链接:https://www.haomeiwen.com/subject/uiqmyhtx.html