2013-04-09 16 views
12

私はソケットプログラミングで作業しています。私はちょうど - mobileorchard.com - Chattyからダウンロードしたコードに関連する疑いを明確にしたいと思います。 R & Dながら、私は上記の呼び出しを実現するため、Room.mファイルで見たときに、私はChatRoomViewController.mファイルなぜdoesNotRecognizeSelector:メソッドを呼び出すのですか?

[chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name]; 

に関数呼び出しを見ました。それは

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name 
{ 
    // Crude way to emulate an "abstract" class 
    [self doesNotRecognizeSelector:_cmd]; 
} 

i「がdoesNotRecognizeSelector:」のためにGoogleで検索したAppleによると、そのエラー処理のために、「ランタイムシステムはオブジェクトが前方に反応したりすることはできませんaSelectorメッセージを受信するたびに、このメソッドを呼び出します」旨私の質問はなぜ開発者がbroadcastChatMessage:fromUser:関数を呼び出すのですか?そのメソッドのどれも使用されておらず、どのメソッドのセレクタが見つかりませんでしたか?

Stackovrflowによると、このQuestionに従って、抽象クラスを作成するために使用され、その "不完全な実装"の警告を避けるために。

私はまだその方法がその中で使われている理由を知りませんChatty Code、その方法が使われている理由を理解するのを助けてください。

+1

アプリケーションの元の開発者がC++抽象基本クラスの機能をエミュレートしようとしていたようですが、そのインスタンスが無効であるようです。これは単にメソッドが何もしない、またはプレースホルダの値(通常は0またはNULL)を返すような極端な形式です。 – CodaFi

答えて

11

これは、実行時呼び出しでメソッドが認識されない場合に例外へのパスをトリガーする、派生オブジェクトであるNSObjectに存在するメソッドです。たとえば、-fooと呼ばれるNSStringにメッセージを送信しようとすると、そのメッセージはNSStringの有効な方法ではないため、そこに表示されます。

この場合、ChattyクラスRoomは決して直接使用されない基本クラスです。 LocalRoomおよびRemoteRoomから派生し、これらのクラスの両方が-broadcastChatMessage:fromUserのオーバーライド実装を提供します。誰もその基本クラスのバージョンを呼び出すことはありませんが、「完全性」のために、プログラマーはメソッドを実装することによってサブクラスがこれをオーバーライドする必要があることを保証しました。

これは、特に慣用的なObjective-Cではありません。 「抽象」クラスは、C++や他の言語の概念です。サブクラス化する "パターン"としてのみ存在する基本クラスです。 (ObjCでは、意味のない状態がある場合には、形式的に@protocolを作成することで、これはしばしば行われます。

-doesNotRecognizeSelector:への呼び出しは任意です。このメソッドは実際に実装されているので、ここでコンパイラの警告を避ける必要はなく、元の作者は簡単に直接例外をスローすることも、代わりに何もしないこともできます。

4

あなたはすでにあなた自身の質問に答えているようです。 Objective-Cで抽象クラスを作成する方法はありません。そのため、スロー例外をオーバーライドする必要があるメソッドをもっとも近い方法です。このメソッドをサブクラスでオーバーライドすると、doesNotRecognizeSelector:は呼び出されなくなります。基本的には、開発者にサブクラスでこのメソッドを実装することを約束する方法です。

また、これを記述しないと、ヘッダに定義されているメソッドの実装が存在しないため、コンパイラは警告を出します。これはそれを実装しないのと同じ振る舞いをしますが、コンパイラは意図的に実行していることを認識します。

関連する問題