AppleのObjective-C仕様によると、マークされていないインスタンス変数はすべて@protected
。どのディレクティブがメソッドのデフォルトであるかを示す情報は見つかりませんでした。それらは、、、@protected
または@private
ですか@public
?
2 に答える
これらの仕様は、メソッドには適用できません。メソッドは、ObjCのivarとはまったく異なる動作をします。具体的には、実際にはメソッドを呼び出しません。メッセージを送信します。次に、オブジェクトはメッセージを解釈し、何らかのアクションを実行します。通常のアクションは、送信されたメッセージと同じ名前のメソッドを実行することですが、他のオプションもあります。*もう1つの一般的なアクションは、オブジェクトがメッセージで他に何をすべきかを理解できないため、例外をスローすることです。このディスパッチ手順はObjCの基本であり、メソッドを真にプライベートにすることはできないことを意味します。
任意のメッセージを任意のオブジェクトに送信できます**。したがって、オブジェクトに存在するすべてのメソッドを実行時に実行できます。
特定の変換ユニットがそれを認識しないように、クラス拡張またはカテゴリで疑似プライベートメソッドを宣言することができます。次に、対応するメッセージを送信しようとすると、コンパイラの警告またはエラーが表示されますが、「プライベート」メソッドを実行することは可能です(performSelector:
およびバリアントを介して、または直接使用する)。objc_msgSend()
*「動的メソッド解決とメッセージ転送」の「ランタイムプログラミングガイド」に示されているものなど。
** ARCでコンパイルし、ブラケット構文を使用する場合[obj message]
、コンパイラはそのタイプのオブジェクトに対してその名前のメソッドの宣言を確認する必要があることに注意してください。ただし、これは別の問題です。
すべてのメソッドとすべてのインスタンス変数は、どこからでも(KVCを使用して)アクセスでき、実際のプライベートはありません。ただし、オブジェクトのインターフェイスにないメッセージを送信しようとすると(メソッドを呼び出すと)、コンパイラは警告を表示します。したがって、@ interfaceのすべてのメソッドはパブリックであり、他のメソッドはプライベートです。インスタンス変数については、もう必要ありません。代わりにプロパティを使用してください。