2012-01-13 14 views
14

ARC移行ツールは、移行の前で始まるにこのコードを受け入れることを拒否している:「セレクタの既知のインスタンスメソッドがありません」performSelector:withObject:afterDelay: '"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: '?

答えて

16

ARCはこれを引き起こすものではなく、NSObjectで定義されています。 idがちょうどNSObjectの(そう、あなただけの「ID」よりも具体的でなければならない)以上の作品、このようにコードを変更します。私はNSObjectの*にデリゲートをキャストしても問題が解決することを考え出した

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

@property (nonatomic, assign) NSObject<OverlayDelegate> *delegate; 
+0

これは、私たちが代理人をIDとして宣言した日がなくなったということです。単に代わりにNSObjectに依存していますか? (とにかく意味をなされる私のために) – openfrog

+1

ARCはメモリ管理目的でこれらのことを強制します。あなたの代理人がNSObject型であることを知っていれば、それだけを述べて、この問題は解消されます。 – dtuckernet

+0

それでも 'id'を使い、' NSObject'のメソッドを使わないでください。とにかく 'NSObject'のメソッドを使っているのはなぜですか?ここには要件がありますか? – mattjgalloway

0

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

いくつかの奇妙な理由でオートコンプリートも起きなかったith -performSelector:withObject:afterDelay:だから手動で入力しなければならなかった。代わりに、それだけで-performSelector:-performSelector:withObject:withObject:

私の推測では、それはObjective-Cの中のデリゲートの型としてIDを使用するだけで愚かだし、私を含め誰もがそれを行うだけではなくて、それを定義している理由は、私は本当に知らなかったということです提供しましたNSObject。しかし、私の議定書では、そのプロトコルに準拠している人は誰でも、NSObjectプロトコルに従わなければならないと言っていました。OverlayDelegate <NSObject> - でも、コンパイラはそれを得ていませんでした。

今のところ、私はキャストにはうまくいきましたが、古い魚を食べるように感じます。

+0

注:私の答えを入力している間、答えはdtuckernetによって投稿されたようです。だから彼は速かった。 – openfrog

+2

'performSelector:withObject:afterDelay:'はプロトコルの 'NSObject'ではなく' NSObject'クラスで定義されているからです。そのため、(ARCのもとで)エラーが発生し、コード補完に失敗しました。 – mattjgalloway

+0

今は完全に意味をなさない。 – openfrog

3

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

0

私はエラーに会った:

No known class method for selector conformsToProtocol:

理由があることである:ファイル名が@interface@implementationと、クラス名と同じではありません。

関連する問題