私はこれについて少し読んでいますが、理解できないのは、クラス拡張を追加してメソッドをプライベートにする理由です。
ヘッダーファイルから除外するだけで十分ではないでしょうか? 私には十分に見えますが、もっと大きな点が欠けているのではないでしょうか?
私はこれについて少し読んでいますが、理解できないのは、クラス拡張を追加してメソッドをプライベートにする理由です。
ヘッダーファイルから除外するだけで十分ではないでしょうか? 私には十分に見えますが、もっと大きな点が欠けているのではないでしょうか?
短い答え: 現在 (Xcode 4.4 の時点で、そう思います)、そうではありません。理由: メソッドの宣言を転送する必要はありません。プライベート メソッドを .m ファイルに入れれば完了です。
以前 (Xcode 4.3 以前)、メソッドを呼び出す前にメソッドを前方宣言する必要がありました。クラスは .h ファイルで既に宣言されているため、.m ファイルで再び宣言することはできません。そのため、クラス拡張は、既に宣言されたクラスにメソッドを追加する方法です。
編集: @Yar が上 (および下) で述べたように、宣言されていない .m ファイル内のプライベート メソッドは、そのクラスのサブクラスには表示されません。つまり、そのサブクラスがそのメソッドを呼び出したりオーバーライドしたりすることは不可能です。それでも、それをオーバーライドまたは呼び出す必要があるサブクラスが作成されるまでは、わざわざ宣言しない傾向があります。私にとって、これはめったに起こりません。
クラスの継続は、翻訳に関して、アクセスとは何の関係もありません。objc 言語はメソッドへのアクセスを指定しません。なので比較的弱いプライベートです。人々が頼りにするのは、実装ファイルでメソッド宣言を非表示にする機能です。
ここで取り上げるべき重要な点は、クラスの継続は通常、自分のクラスにしか見えないということです (*.m
ファイルに配置されることが多いため)。このパターンは、プライベート メソッドの使用の可能性を減らし@implementation
ます。これは、クライアントまたはコンパイラ (典型的な構造にクラスを含むもの以外の変換) には見えないためです。
また、クラスの継続には多くの機能があることに注意してください。つまり、プライベートを保存するのに便利な場所@interface
です。プロパティ、ivar、メソッド。
最後に、以前からの習慣でもあります。これは、より頻繁に必要になるためです。少し前に宣言が追加されたため、コンパイラはオブジェクトが特定のセレクターとそのセレクターの署名に応答したことを認識しました。最近、clang は @implementation ブロック全体を解析するため、宣言の順序に関係なく、@implementation で見られるメソッドをコンパイラが照合できるため、多くの人がクラス継続での宣言を必要としないことに気付きます。
ヘッダー ファイルから除外するだけで十分ですが、サブクラスもその存在を認識しません。これは、これらのプライベート メソッドを呼び出そうとすると、コンパイラ エラーが発生することを意味します。これが、クラス拡張子である外部ファイルを使用し、すべてのサブクラスがその拡張子を .m ファイルにインポートする理由です。
明らかに、この状況は理想的ではありません。なぜなら、クラスごとに少なくとも 3 つのファイルを取得するからです。しかし、Objective-C の利点は、大量のファイルを作成することであり、それについて心配する必要はありません。ファイルを作成するのが怖い場合は、アンチパターンである大きなクラスになってしまいます。
1 つの問題は、クラス拡張ファイルの名前付けです。これは、カテゴリのないカテゴリであるためです。私は Blah4Subclasses のようなスキームを使用してきましたが、これはおそらくあなたが得るのと同じくらい悪い提案です。
.h ファイルに @private を追加できます。