3

一部のレガシー コード (はい、これは現在ブロックに取って代わられています) には、次の行があります。

[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 に対処できます。

4

3 に答える 3

4

NSStringFromSelectorセレクターをログに記録する正しい方法を既に使用しています。セレクターを自分で作成するか、ターゲット クラスにどのセレクターがあるかを尋ねるかは、別の問題です。

を使用respondsToSelector:して、指定したクラスが呼び出したいメソッドを実際に処理できるかどうかを判断することもできます。

于 2013-07-03T11:21:25.697 に答える
1

はい、SEL オブジェクトを意味するセレクターは、実際のメソッドが実装されていない場合でも存在する可能性があります。

Objective-C では、オブジェクトがメソッドに対応しているかどうかに関係なく、オブジェクトは任意のセレクターに応答できます。セレクターの検証は実行時の作業です。(ただし、ARC で導入されたいくつかの制限)

レシーバーに実装されているかどうか (より正式には、セレクターに応答するかどうか) を確認したい場合は、その-(BOOL)respondsToSelector:(SEL)selectorメソッドを使用します。

于 2013-07-03T11:22:45.467 に答える
0

おそらくUIWindow、セレクターが実際に実装されているかどうかを確認selfします

- (BOOL)respondsToSelector:(SEL)aSelector

実装されていない場合、メソッドは呼び出されません。

于 2013-07-03T11:22:05.663 に答える