4

简短描述:doesNotRecognizeSelector在对肯定具有此方法的对象调用方法时出现错误,并且在调用respondsToSelector.

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

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

下面的一些代码。希望能帮助到你

1)我viewController反对AppDelegate

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

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

2)在其他类中,我试图获取此对象并调用其方法之一。但随叫随到,一切都因错误而[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
...

PS可能是堆栈跟踪会更好地显示它: 在此处输入图像描述

4

2 回答 2

1

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

在越狱设备上,有许多工具可以导致这种情况。例如,显示隐藏在应用内购买背后的内容的工具或隐藏广告的工具。

这些工具通常针对应用内购买或广告的开放库。如果您使用这样的库,该工具只会用自己的实现替换您的类的实现,该实现是为了覆盖您的功能 - 表现得就像一切都已经支付或删除显示广告的方法(例如,请参阅http ://www.tenorshare.com/guide/how-to-block-ads-on-iphone-ipad-ipod.html )

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

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

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

于 2017-01-17T14:11:47.270 回答
0

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

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

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

@interface AppDelegate : UIResponder <UIApplicationDelegate> {
}

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

于 2017-01-17T10:31:41.013 回答