15

ARC 移行ツールは、移行を開始する前にこのコードを受け入れることを拒否しています:

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

デリゲートは、プロトコルを使用してこのメ​​ソッドを実装する必要があり、正常に動作するはずです。

@protocol OverlayDelegate <NSObject>
- (void)overlayDismissed:(Overlay*)overlay;
@end

@interface Overlay : UIImageView {
    id<OverlayDelegate> delegate;
}

@property (nonatomic, assign) id<OverlayDelegate> delegate;

ARCの何が問題になっていますか?「セレクター 'performSelector:withObject:afterDelay:' の既知のインスタンス メソッドがない」と表示されるのはなぜですか?

4

4 に答える 4

16

ARC がこれを引き起こしているのではありません。単に露出しているだけです。そのメソッドは NSObject で定義されていますが、id は NSObject 以外にも機能します (したがって、単に 'id' よりも具体的にする必要があります)。コードを次のように変更します。

@interface Overlay : UIImageView {
    NSObject<OverlayDelegate> *delegate;
}

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate;
于 2012-01-13T01:35:34.367 に答える
3

シンプルです。オブジェクトはタイプであり、プロトコルidに準拠しています。NSObjectただし、このプロトコルは を宣言しないperformSelector:withObject:afterDelay:ため、ARC はメソッドが何を行っているか、メソッドが何かを保持する必要があるかどうかを知りません。メソッド呼び出しを行う前に、NSObject を使用するかキャストしてください。

于 2012-01-13T01:36:31.403 に答える
0

エラーが発生しました:

セレクタ conformsToProtocol の既知のクラス メソッドはありません:

その理由は次のとおりです。ファイル名が および のクラス名と等しくありませ@interface@implementation

于 2016-08-11T02:02:21.753 に答える
0

デリゲートを NSObject* にキャストすると問題が解決することがわかりました。

[self.delegate performSelector:@selector(overlayDismissed:) withObject:self afterDelay:0];

なんらかの奇妙な理由でオートコンプリートすら思いつかなかった-performSelector:withObject:afterDelay:ので、手動で入力する必要がありました。代わりに、提供する-performSelector:のは-performSelector:withObject:withObject:

私の推測では、Objective-C でデリゲートの型として id を使用するのはばかげていると思います。また、ID を単に NSObject として定義するのではなく、私を含むすべての人がそうしている理由がまったくわかりませんでした。しかし、私のプロトコルは、そのプロトコルに準拠する人は誰でも、これを行うことによって NSObject プロトコルにも準拠する必要があるとさえ言っていました: OverlayDelegate <NSObject>- それでも、コンパイラはそれを取得しませんでした.

だから今のところキャストには満足していますが、古い魚を食べているような気がします.

于 2012-01-13T01:36:28.080 に答える