9

私は数週間前にObjective-Cを学び始めましたが、クラスのカプセル化を正しく管理する方法をまだ理解していません。クラスでプライベートメンバー変数を宣言する最良の方法は何ですか?

インターフェイスで「@private」と宣言するだけでなく、「@property」を使用してメンバー変数に適切なゲッター/セッターを設定するのが正しい方法のようです。しかし、これでも他のクラスがこれらの変数にアクセスできるようになっているように思われます。プロパティを「読み取り専用」と宣言した場合でも、外部クラスはメンバー変数への参照にアクセスして変更できます。

したがって、プライベートメンバー変数を宣言する最良の方法は、プロパティを宣言しないことによってゲッター/セッターを含めないことだと思います。私は正しいですか?それとももっと良い方法はありますか?

ありがとう

4

1 に答える 1

23

他のクラスからアクセスできないようにする場合は、実装で@propertyを宣言し、クラスの匿名カテゴリを作成します。

ヘッダーファイル:

// MyClass.h
@interface MyClass : NSObject {
    NSObject *_privateObject;
    NSObject *_readonlyObject;
    NSObject *_publicObject;
}

@property (nonatomic, retain, readonly) NSObject *readonlyObject;
@property (nonatomic, retain) NSObject *publicObject;

@end

実装:

// MyClass.m
@interface MyClass ()
    @property (nonatomic, retain) NSObject *privateObject;
    // Make it writable on the implementation
    @property (nonatomic, retain, readwrite) NSObject *readonlyObject;
@end

@implementation MyClass

@synthesize privateObject = _privateObject;
@synthesize readonlyObject = _readonlyObject;
@synthesize publicObject = _publicObject;

これらは、3つの異なるプロパティの例です。

  • privateObjectは他のクラスには表示されません。
  • readonlyObjectは表示されますが、読み取り専用です。
  • publicObjectは表示され、取得および設定できます。
于 2010-08-26T02:07:27.640 に答える