12

私はC++/ Javaの世界から来ました。そこでは、プライベートメンバーを作成する方法が非常に明白です。ただし、Objective Cでこれを行う方法はいくつか見たので、短所と長所を聞きたいと思います。

1).hファイルで@privateとして宣言します

@interface MyClass : NSObject
{
    @private
    int someMember;  
}
@end

2).mファイル内のインターフェースでそれらを宣言します

@interface MyClass() {
    int someMember;  
}
@end

@implementation MyClass
@end

3)実装でそれらを宣言します

@implementation MyClass {
     int someMember;  
}
@end 

推奨される方法とその理由は何ですか?他の方法を見逃しましたか?

4

3 に答える 3

9

私の好みは#3です:

// MyClass.m
...
@implementation MyClass {
     int someMember;
}
@end

それはあなたがきれいにうまく抽象化し、依存関係を最小限に抑えることを可能にします。

すべてのobjcオブジェクトは動的に割り当てられ、物理的な依存関係はほとんどないため、ビルド時間が最短になり、オブジェクト表現が最も豊富になり、コンパイルのオーバーヘッドが最小限に抑えられます(たとえば、最小#importのsと物理的な依存関係)。

抽象化も大きなプラスです。privateがデフォルトであり、それから逸脱する理由はほとんどなく、内部を他の人に公開する理由もほとんどありません。これにより、型の安全性が損なわれないようにしながら、すべてが非常にうまく隠されます。大きなプラス:すべてのC ++ライブラリの依存関係に全員をさらすことなく、オブジェクトでC ++値を簡単に宣言することもできます。PIMPL、グローバルスコープの構造体、* void **ではなく、適切なです。これは優れたコンパイルファイアウォールです。大規模なCまたはC++プロジェクトに取り組んだことがある場合は、喜ぶかもしれません。

もちろん、オプション#2に見られるようにivarsを宣言すると、これらすべてがもたらされます。したがって、変数をどこでどのように表示するかによって大きく異なります。ivar宣言は具象ですが、プロパティは抽象化される可能性があります。したがって、具象を具象でグループ化し、インターフェースをインターフェースでグループ化することを好みますが、どちらの方法でもかまいません。下位互換性が必要でない限り、#2または#3が理想的です。

(疑似)プライベートプロパティが必要な場合は、クラスの継続で宣言することをお勧めします。

// MyClass.m
...
@interface MONClass ()
@property (nonatomic, copy) NSString * string;
@end
于 2012-08-23T21:19:21.730 に答える
3

Objective-Cに追加された順に、ほぼ時系列でそれらを便利にリストしました。

これは主にスタイルの質問だと思いますが、99%の確率で次のようになります。

(1).hファイルは事実上公開されたインターフェースであり、実装の詳細を公開する理由がないため、それらを.hファイルに入れないでください。

(2)無関係な構文を避けるという理由で@implementation、クラス拡張ではなくそれらを配置します。@interfaceあなたは常に実装を持っているでしょう、あなたはクラス拡張を持っていないかもしれません。

于 2012-08-23T21:20:42.197 に答える
0

MyClassを編集せずに使用したい場合は、ヘッダーファイルをすばやく読み取って、その動作を理解します。彼らはあなたのプライベート変数を気にしないので、それらをヘッダーから遠ざけるのが最善です。

プライベートプロパティまたはプライベートに実装されたプロトコルが必要な場合は、.mファイルでクラス継続を使用する必要があります。

@interface MyClass () <SomeKindOfDelegate>
@property id someProperty;
@end

@implementation MyClass
@synthesize someProperty;
- (void)someKindOfDelegateMessage:(id)sender { }
@end

それを実行するまでに、メンバー変数を継続に配置することもできます。

@interface MyClass () <SomeKindOfDelegate>
{
    int someMember;
}
@property id someProperty;
@end

@implementation MyClass
@synthesize someProperty;
- (void)someKindOfDelegateMessage:(id)sender { }
@end
于 2012-08-23T21:32:33.170 に答える