ビルド時に No known instance method for selector エラーが発生した場合 : Objective-C プログラミング
PROGRAM
ビルド時に No known instance method for selector エラーが発生した場合
ARC を有効にしてビルドしたときに、デリゲートとして設定されたインスタンスがメソッドを実装しているかどうかを調べるコードを書いたところ、コンパイル時に次のエラーが発生してしまいました。
No known instance method for selector 'respondsToSelector:'
エラーが発生したのは、次のような行です。
if ([self.delegate respondsToSelector:@selector(EzCustomClassDelegateMethod:)])
respondsToSelector: メソッドといえば、デリゲートを呼び出す上で @optional なメソッドが実装されているかを知る基本的なメソッドですけど、この部分でコンパイルが通らなくなってしまいました。
ちなみに self.delegate は、次のような宣言になっています。
@protocol (readwrite,weak) id<EzCustomClassDelegate> delegate;
ただ、他のクラスの似たコードではコンパイルがちゃんと通る場合もあって、なんだか不思議な感じです。
そこで、原因が何かを調べてみたところ、自分で定義したプロトコルに問題があることがわかりました。
エラーが発生していた時のプロトコルの定義は次のような感じだったのですけど、これは間違いで、
@protocol EzCustomClassDelegate
正しくは、次のようにして、自分のプロトコルに NSObject プロトコルを持たせなければいけないことがわかりました。
@protocol EzCustomClassDelegate <NSObject>
このようにすれば、NSObject プロトコルに respondsToselector: メソッドが宣言されているため、これで無事、コンパイルが通るようになりました。
つまりは、クラスを実装するときに NSObject クラスから派生させないといけないように、プロトコルも NSObject プロトコルから派生させないといけないということですね。
あまりに初歩的すぎるルールなのかもしれませんけど、忘れてついついはまってしまったので、備忘録も兼ねて記しておくことにします。
[ もどる ]