简短说明:对于肯定有此方法的对象调用方法时出现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
...
答案 0 :(得分:1)
我意识到有一种非常罕见的情况会发生这种情况。
在越狱设备上,有许多工具可以导致这种情况。例如。用于显示隐藏在应用内购买中的内容的工具或隐藏广告的工具。
这些工具通常针对应用内购买或广告定位开放式库。如果您使用这样的库,该工具将仅通过自己的实现替换您的类的实现,该实现将覆盖您的功能 - 表现得像已经支付的所有内容或删除显示广告的方法(例如,请参阅{ {3}})
我找到了至少两个使用类AdRootViewController
的开放库。这意味着此类工具将尝试替换您的类的实现,在此过程中还会删除方法showBanner
。
您只能检查这些崩溃报告是否来自越狱设备(如果您没有使用崩溃报告或类似的崩溃报告库,请使用它)。
如果您知道该错误仅出现在越狱设备上,请忽略它。这是用户在尝试删除广告时造成的。
答案 1 :(得分:0)
整个代码看起来很完美。
所以错误是无法读取的,这是奇怪的,你正在检查这个respondsToSelector:@selector(showBanner)
因为在这段代码中没有必要检查一个视图控制器是否能够响应该方法,因为它是一个对象方法,如果视图控制器不是nil就必须调用,所以只需要检查一个viewController不是nil
所以在你的代码中我发现了一些可能导致这个错误的东西,我不知道怎么回事,但可能是因为这不是常见的事情 所以,你可以尝试这个,它是否有效
你的代码中的appDelegate是一个NSObject类型,但一般来说这是UIResponder类型所以我只是将NSObject替换为UIResponder
@interface AppDelegate : UIResponder <UIApplicationDelegate> {
}
请试试这个 希望这会对你有所帮助