respondsToSelector 检查后出现 doesNotRecognizeSelector 错误

doesNotRecognizeSelector error after respondsToSelector check

简短描述:当对肯定有此方法的对象调用方法时,我得到 doesNotRecognizeSelector 错误,它发生在调用 respondsToSelector.

之后

这是一个非常奇怪的情况,我不明白这是怎么回事:)。我在一些用户设备的日志中看到了这个错误,但不是在所有用户设备上。我无法在自己的设备上重复此操作。

我试图弄清楚它是如何发生的,并添加了 respondsToSelector 条件,但问题再次发生。

下面是一些代码。希望对你有帮助

1) 我在 AppDelegate.

中有 viewController 个对象
@interface AppDelegate : NSObject <UIApplicationDelegate> {
}
@property (nonatomic, retain) AdRootViewController *viewController;
...
@end

@implementation AppDelegate
@synthesize viewController;
...
@end

2) 在其他 class 中,我正在尝试获取此对象并调用其方法之一。但是在 [viewController showBanner] 上调用全部失败并出现 doesNotRecognizeSelector 错误。

- (void) onEnterTransitionDidFinish {
    [super onEnterTransitionDidFinish];

    AdRootViewController *viewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] viewController];
    if (viewController != nil && [viewController respondsToSelector:@selector(showBanner)]) {
        [viewController showBanner];
    }
}

3) AdRootViewController 有这个方法,它是在接口中声明的。

@interface AdRootViewController : UIViewController {
}
- (void)showBanner;
...
@end

@implementation AdRootViewController
...
- (void)showBanner
{
    adBannerViewIsVisible = YES;
    ...
}
...
@end

失败的代码串是[viewController showBanner].

错误日志如下所示:

1 CoreFoundation __exceptionPreprocess + 1245624
2 libobjc.A.dylib objc_exception_throw + 34136
3 CoreFoundation -[NSObject(NSObject) doesNotRecognizeSelector:] + 1274468
4 CoreFoundation ___forwarding___ + 1262188
5 CoreFoundation _CF_forwarding_prep_0 + 186376
6 <project_id> 4296487336 + 487848
...

P.S。可能是堆栈跟踪会更好地显示它:

整个代码看起来很完美。 所以错误无法读取,这很奇怪你正在检查这个 respondsToSelector:@selector(showBanner) 因为在这段代码中,不需要检查视图控制器是否能够响应该方法,因为它是一个对象方法,如果视图控制器不是 nil,它就必须调用,所以只需要检查 viewController 不是无

所以在你的代码中我发现了一些可能导致这个错误的东西我不知道如何但可能是因为这不是常见的事情 所以你能帮我试试看它是否有效

在你的代码中,appDelegate 是一个 NSObject 类型,但通常这是 UIResponder 类型,所以我只是将 NSObject 替换为 UIResponder

@interface AppDelegate : UIResponder <UIApplicationDelegate> {
}

请试试这个 希望这对你有帮助

我意识到这种情况只有一种非常罕见的情况会发生。

在越狱设备上,有许多工具可能导致此问题。例如。显示隐藏在 in-app 购买后的内容的工具或隐藏广告的工具。

这些工具通常针对开放图书馆进行 in-app 购买或广告。如果您使用这样的库,该工具将只用它自己的实现来替换您的 class 的实现,该实现覆盖您的功能 - 表现得就像一切都已经支付或删除显示广告的方法(对于例如,参见 http://www.tenorshare.com/guide/how-to-block-ads-on-iphone-ipad-ipod.html)

我发现至少有两个使用 class AdRootViewController 的开放库。这意味着这样的工具将尝试替换您的 class 的实现,在此过程中还会删除方法 showBanner.

您只能检查那些崩溃报告是否来自越狱设备(如果您没有使用 crashlytics 或类似的崩溃报告库,请使用它)。

如果您知道该错误仅出现在越狱设备上,请忽略它。这是用户在尝试删除您的广告时造成的。