3

そのため、最近、クラスでより多くのプライベートインターフェイスを使用しています。私は、他のクラスに必要なものを.h(パブリック)に残し、他のすべてのメソッドを.mのプライベートインターフェイスに保持しています。私の質問は、アプリがこれなしで正常に動作するため、プライベートインターフェイスにメソッドを保持する理由が見当たらないということです。本当にポイントは何ですか?プライベートインターフェイスにviewDidLoadのようなシステムメソッドがないのはなぜですか?

4

2 に答える 2

3

プライベートカテゴリへのメソッド宣言の追加は、最新のLLVMコンパイラでは廃止されています。以前は、メソッドを適切な順序で実装する必要がありました。または、.mファイルのプライベートカテゴリにメソッド宣言を追加することもできました。最新のコンパイラはこれの必要性を排除します。新しいコンパイラは2パスコンパイルを実行するため、すべてのメソッドを認識します。

したがって、あなたの質問に対する簡単な答えは-決してありません。:)

編集:この回答に対する進行中の議論を反映するためのサンプルコードを次に示します。

.hファイル内:

// Only public stuff here
@interface Foo
- (void)somePublicMethod;
@end

.mファイル:

// private additions - clients don't need to know about this stuff
@interface Foo () <UIActionSheetDelegate, UIPickerViewDelegate>
@property (nonatomic) UIPickerView *pickerView; // private property
@end

@implementation Foo {
    UIActioSheet *_myActionSheet; // private ivar
}

- (void)somePrivateMethod {
    [self anotherPrivateMethod]; // yeah - I can call methods further down in the class
}

- (void)anotherPrivateMethod {
}
@end
于 2012-10-30T23:23:49.123 に答える
0

そのため、最近、クラスでより多くのプライベートインターフェイスを使用しています。私は、他のクラスに必要なものを.h(パブリック)に残し、他のすべてのメソッドを.mのプライベートインターフェイスに保持しています。

それは最高です。場合によっては、命名規則または接頭辞を使用して、命名の衝突を回避する必要があります。次に進む…</p>

私の質問は、アプリがこれなしで正常に動作するため、プライベートインターフェイスにメソッドを保持する理由が見当たらないということです。本当にポイントは何ですか?

カプセル化。必要な変更の副作用を最小限に抑えるために、クライアント(およびサブクラス)からデータと実装を非表示にします。クライアントが実際にパブリックインターフェイスで3つのメソッドのみを必要とする場合は、これらの3つのメソッドのみを宣言します。実装の詳細の残りの部分は、クラスに対して非公開にしてください。これを使用しない場合、クライアントがこれらの不要なメソッドを使用する場合、ミュータント実装は増加する傾向があります。つまり、何かを変更する必要がある場合は、複数のソースファイル(およびライブラリを作成する場合はアプリ)全体で確認するための詳細が大量にあります。クラスのパブリックインターフェイスは、最小限に抑えることに重点を置くのに適した領域です。

プライベートインターフェイスにviewDidLoadのようなシステムメソッドがないのはなぜですか?

viewDidLoad必要に応じて、サブクラスによってオーバーライドされるように設計されました。その宣言は、2つの主な理由で公開されています。

  • ドキュメンテーション。実装にはこの初期化ステップが必要であり、それを正しくオーバーライドする方法を知っている必要があります。
  • したがって、を書くことができ[super viewDidLoad]、コンパイラはあなたが正しいことをしていることを保証することができます。UIViewControllerインスタンスメソッドとして宣言していなかった場合、少なくとも1つのコンパイラ警告が発生します。
于 2012-10-30T23:58:40.067 に答える