简而言之,以下代码调用超类中现有的选择器,然后给出一个 NSInvalidException:
- (void)applicationWillResignActive:(UIApplication *)application {
if ([super respondsToSelector:@selector(applicationWillResignActive:)])
{
[super applicationWillResignActive:application];
}
这给出了以下日志异常:
- *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[aAppDelegate applicationDidEnterBackground:]:无法识别的选择器发送到实例 0x5b5d360”
详细说明...我有一个基本应用程序委托(来自我们的新公司库)声明为:
我有一个基础应用程序委托类 BaseAppDelegate。它被声明为:
@interface CoAppDelegate : NSObject <UIApplicationDelegate>
它实现:
- (void)applicationDidBecomeActive:(UIApplication *)application
{
DebugLog(@"*** ACTIVE ****");
}
它没有实现 @selector(applicationWillResignActive:) - 或者至少我的意思是我没有专门为该方法编写代码。在 .h 或 .m 文件中找不到它。
我的应用程序有一个从 CoAppDelegate 继承的应用程序委托:
@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 说明响应者不存在 - 而且它不存在,所以这是要抛出的正确异常。
我需要知道的是,为什么当我期望看到 NO 时,responsToSelector 会给出 YES?我错过了什么微妙的小东西?