一部のレガシー コード (はい、これは現在ブロックに取って代わられています) には、次の行があります。
[UIWindow setAnimationDelegate:self];
[UIWindow setAnimationDidStopSelector:@selector(animationFinished:finished:context:)];
しかし、そのメソッド - animationFinished:finished:context: - は定義されていませんが、コードはクラッシュしません。理由を知りたかったので、@selector が返すものをログに記録しようとしましたが、方法がわかりません。
NSLog(@"%@", NSStringFromSelector(@selector(animationFinished:finished:context:)));
役に立ちません-そのメソッドが実際に実装されているかどうかに関係なく、セレクターの文字列名をログに記録します。
nil を多くのメソッドに安全に渡すことができるので、ここでは @selector() が nil を返していると推測しましたが、次のコードでは何もログに記録されません。
if (@selector(animationFinished:finished:context:) == nil) {
NSLog(@"SEL is NIL");
}
したがって、ここには nil 以外の SEL タイプがあるようですが、対応するメソッドはありません。NSLog() を SEL タイプにする方法はありますか、それともここで何が起こっているのか説明できますか? おそらく、setAnimationDidStopSelector: の実装は、対応するメソッドがなく、単に無視する SEL に対処できます。