【发布时间】:2011-06-26 22:57:40
【问题描述】:
简而言之,下面的代码调用超类中已有的选择器,然后给出一个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?我错过了什么微妙的小东西?
【问题讨论】:
-
我要问你为什么要这样做?你知道你的类的基类的 API,所以你知道它实现和不实现哪些方法。没有必要进行测试。事实上,您不需要实现这些方法。
-
原因有点复杂,归根结底是因为太新(对于 iPhone,来自 java...),以至于当我无法以一种方式工作时,我会尝试其他方式...在那个周期中重复了几次,我得到了上面的(不必要的)代码。尽管不需要,但它仍然提出了一个我真正想了解的问题(甚至认为“真实”代码是在不使用这种方法的情况下修复的)。在 Java 中,我可以使用反射来做类似的事情,但不同之处在于超类上的反射不会包含子类上的方法。所以我真的只是想了解。
标签: iphone objective-c uiapplicationdelegate