質問

Objective-Cを学んでおり、C / C ++のバックグラウンドを持っています。

  • オブジェクト指向C ++では、親クラスで宣言されている場合でも、メソッドを定義(実装)する前に常にメソッドを宣言する必要があります。

  • 手続き型C、IIRCでは、同じコンパイル単位(つまり、同じファイル)で後で呼び出されたものからのみ呼び出される限り、関数を定義するだけで済みます。ファイル(他の場所で" extern"で宣言しない限り)。

  • 今、Objective-Cでは、外部の何かで使用されるセレクターのみをヘッダーファイルで宣言する必要があり、.mファイルでセレクターを作成することができますそして、それらを.mファイル内で呼び出します。また、デリゲートメソッドまたは継承されたメソッドは(再)定義されないようです。

私は正しい軌道に乗っていますか? Objective-Cでセレクターを定義する必要があるのはいつですか?

役に立ちましたか?

解決

Objective-Cメソッドの一般的な方法は、公開するメソッドをヘッダーファイルの @interface セクションに配置して、他のコードに.hのみを含め、対話する方法を知ることです。あなたのコードで。順序ベースの「遅延宣言」 Cの関数と同じように機能します—順序付けによって解決できない依存関係がない限り、メソッドプロトタイプを宣言する必要はありませんが、必要に応じて @implementation 内にメソッドプロトタイプを追加できます。 。

そうです、あなたは正しい軌道に乗っています。継承されたメソッドのメソッドプロトタイプを繰り返さないでください—コンパイラは親のヘッダーファイルでそれを見つけます。デリゲートメソッドは、カテゴリ内のプロトタイプとして定義し(クラスに追加)、必要に応じて実装できますが、デリゲートは既に定義されているため、メソッドプロトタイプを提供する必要はありません。 (わかりやすくするためなど、必要に応じて引き続き使用できます)

Objective-Cを学習しているだけなので、この答えの残りの部分は、あなたが要求したよりもはるかに詳細です。あなたは警告されました。 ;-)


変数を静的に入力すると(たとえば id の代わりに MyClass * )、クラスがアドバタイズしないメソッドを呼び出そうとするとコンパイラが警告を表示します実装するかどうか、実装するかどうか。変数を動的に入力する場合、コンパイラは好きなものを呼び出すことを止めません。存在しないものを呼び出した場合にのみランタイムエラーが発生します。言語に関する限り、実行時にエラーなしでクラスが実装するメソッドを呼び出すことができます—メソッドを呼び出すことができる人を制限する方法はありません。

個人的には、これは実際に良いことだと思います。コードのカプセル化と他のコードからのコードの保護に非常に慣れているため、発信者を信頼できる同僚や顧客ではなく、不正な悪党として扱うことがあります。 「あなたはあなたの仕事をし、私は私の仕事をする」という考え方でコーディングするのは非常に楽しいと思います。誰もが境界を尊重し、自分のものを大事にします。あなたは「態度」と言うかもしれません; Objective-Cの厳格な施行ではなく、コミュニティの信頼の1つです。たとえば、私のデスクに来てくれる人を助けたいと思っていますが、誰かが私のものをいじったり、尋ねずに物を動かしたりすると、本当にイライラします。適切に設計されたコードは、偏執狂的または社会心理学的である必要はなく、一緒にうまく機能する必要があります。 :-)

とはいえ、インターフェイスをユーザーに公開する際に必要な/必要とする粒度のレベルに応じて、インターフェイスを構造化するための多くのアプローチがあります。パブリックヘッダーで宣言するメソッドは、基本的に誰でも使用できる公平なゲームです。メソッド宣言を非表示にすることは、車や家をロックするようなものです—おそらく全員を排除することはできませんが、(1)「正直な人を正直に保つ」こと。彼らがいじってはならないもので誘惑しないようにすることで、(2)やることをする人は、彼らがそうするべきではないことを確かに知っており、本当に悪い結果を訴えることはできません。

以下に、ファイルの命名に使用するいくつかの規則と、各ファイルの内容を示します—一番下の.mファイルから始まり、各ファイルにはその上のファイルが含まれます。 (インクルードの厳密なチェーンを使用すると、シンボルの重複警告などが防止されます。)これらのレベルの一部は、Cocoaフレームワークなどのより大きな再利用可能なコンポーネントにのみ適用されます。必要に応じてそれらを調整し、あなたに合った名前を使用してください。

  • MyClass.h —パブリックAPI(アプリケーションプログラミングインターフェイス)
  • MyClass_Private.h —企業内SPI(システムプログラミングインターフェイス)
  • MyClass_Internal.h —プロジェクト内部IPI(内部プログラミングインターフェイス)
  • MyClass.m —一般にすべてのAPI / SPI / IPI宣言の実装
  • MyClass_Foo.m

他のヒント

ヘッダーファイルでメソッドを宣言すると、コンパイラの警告のみが停止します。 Objective-Cは動的言語であるため、そのメソッドが外部で宣言されているかどうかに関係なく、オブジェクトにメソッドを呼び出す(メッセージを送信する)ことができます。

また、.mファイル内でそれを呼び出すコード(遅延宣言)の上のメソッドを定義した場合、警告は生成されません。ただし、同じことが当てはまりますが、宣言せずにオブジェクトにメッセージを送信できます。

もちろん-これは、Objective-Cにはプライベートメソッドがないことを意味します。クラスが実装する任意のメソッドを呼び出すことができます。

個人設定。パブリックメソッド(外部で使用されるメソッド)の場合。 .hで宣言し、.mで定義します。可視性を制限する場合、または少なくともプライベートメソッドであることを示す場合は、で categories / class extensions を使用します。 mファイル。多くのサンプルコードでは、遅延宣言メソッドを使用しています。

Objective-Cは関数を「メッセージ」として扱います。そのため、「メッセージ」を送信できます。任意のオブジェクト-インターフェースで明示的に受け入れられないものでも。その結果、Obj-Cにはプライベートメンバーのようなものはありません。

これは非常に強力ですが、新しいObj-Cプログラマー、特にC ++、Java、またはC#から来たプログラマーにとって混乱の元です。基本的な経験則は次のとおりです。

  • @interfaceですべてのパブリックメソッドを定義して、消費者が処理するメッセージを把握できるようにする必要があります。
  • @interfaceで@privateメソッドを定義して、コンパイラメッセージを回避し、@ implementationでメソッドを順序付ける必要を回避する必要があります。
  • クラスのメソッドの特定の規則を実装するときは、プロトコルを使用する必要があります。

これらの多くは個人的な好みですが、面倒なコンパイラの警告を回避し、コードを整理するのに役立ちます。わかりやすい。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top