简而言之,下面的代码调用父类中的一个现有选择器,然后给出一个 NSInvalidException:
- (void)applicationWillResignActive:(UIApplication *)application {
if ([super respondsToSelector:@selector(applicationWillResignActive:)])
{
[super applicationWillResignActive:application];
}
这给出了以下日志异常:
- *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[aAppDelegate applicationDidEnterBackground:]:无法识别的选择器发送到实例 0x5b5d360”
详细说明...我有一个基本应用程序委托(delegate)(来 self 们的新公司库)声明为:
我有一个基础应用程序委托(delegate)类 BaseAppDelegate。它声明为:
@interface CoAppDelegate : NSObject <UIApplicationDelegate>
它实现了:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
DebugLog(@"*** ACTIVE ****");
}
它没有实现 @selector(applicationWillResignActive:) - 或者至少我的意思是我没有专门为该方法写出代码。在 .h 或 .m 文件中找不到它。
我的应用有一个从 CoAppDelegate 继承的应用委托(delegate):
@interface aAppDelegate : CoAppDelegate <UIApplicationDelegate>
我将上述两种方法实现为:
- (void)applicationWillResignActive:(UIApplication *)application {
if ([super respondsToSelector:@selector(applicationWillResignActive:)])
{
[super applicationWillResignActive:application];
}
}
- (void)applicationDidBecomeActive:(UIApplication *)application {
if ([super respondsToSelector:@selector(applicationDidBecomeActive:)])
{
[super applicationDidBecomeActive:application];
}
}
当应用程序启动时,我得到了调试输出“*** ACTIVE ****”——这是应该的。
当我将我的应用程序发送到后台时,我得到 NSInvalidArgumentException 声明响应者不存在 - 而且它不存在,所以这是抛出的正确异常。
我需要知道的是为什么当我期望看到否时 respondsToSelector 给出了是?我遗漏了什么微妙的东西?
最佳答案
你应该使用[self superclass]
而不是[super class]
:
[[self superclass] instancesRespondToSelector:@selector(method)]
关于iphone - 误报 respondsToSelector with UIApplicationDelegate 导致 NSInvalidArgumentException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993069/