つまり、次のコードは、スーパークラスの既存のセレクターを呼び出してから、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が表示されることを期待しているときにrespondsToSelectorがYESを返すのはなぜですか?私が見逃している小さな微妙なことは何ですか?