2

OK、それで、 Good Programming Practicesに関するいくつかの記事を読んでいて、クラスのすべての要素を公開することは良い考えではないという声明に出くわしました..別名カプセル化の概念

現在、Objective C では、クラスの要素を作成するときに、次のことを行います。NSMutableArray を検討してください。

@property (nonatomic, retain) NSMutableArray* myArray;

なぜ私はこれを行うのですか?

Retain プロパティを myArray に与えるため、より単純なメモリ管理サイクルを提供します。後で、viewDidLoad で myArray を次のように初期化します。

self.myArray = [NSMutableArray arrayWithCapacity:0];

後でDeallocで...

self.myArray = nil;

他に何が起こるか

このプロパティを指定し、myArray を .m ファイルに合成することで、無意識のうちに、クラスのすべての要素に対してパブリック ゲッターとセッターを作成しています。

また、Xib ファイルから自動生成された UI 要素には、同じ宣言が適用されます。

クラスのすべての要素に対して public の Getter と Setter を作成し続けるのは得策ではありません。

したがって、カプセル化はまったく適用されません。ここで間違っている場合は修正して、解決策を教えてください!

ありがとう!

4

2 に答える 2

5

宣言の一部をファイルに入れることができるクラス拡張の原則を使用するだけ.mで、ヘッダーで非表示になり、他のクラスから非表示になります。

(ちなみに、これは Apple が推奨するプライベート メソッドとプロパティの宣言方法です)

YourClass.h

@interface MyClass : MySuperclass
// public properties
// public methods
@end

YourClass.m

@interface MyClass()
// This is a class extension
// put here private properties
// and private methods too
@end

@implementation MyClass
// And your implementation of course here
@end

たとえば、プロパティをパブリック インターフェイス (ヘッダー ファイル内) で readonly として宣言し、プライベート インターフェイス (ファイル内のクラス拡張内) で readwrite として再宣言することもできます.m

詳細については、Apple のドキュメントを参照してください


ご了承ください:

  • プロパティを宣言する場合、インスタンス変数を宣言する必要はありません。コンパイラが自動的に生成するので、わざわざ.h. コンパイラの最新バージョン(Modern Objective-C)では、@synthesizeディレクティブが存在しない場合は自動的に生成されるため、ディレクティブは必要ありません(ドキュメントを参照)
  • とにかくインスタンス変数を宣言したい場合は、クラス拡張でこれを行うこともでき.mます.h。これは、パブリック ヘッダーからもインスタンス変数を隠す方法です。一般に、インスタンス変数を使用することはめったにありません (プロパティのみを宣言するだけで十分です)。本当に ivar が必要な場合は、クラス拡張で宣言して、パブリック ヘッダーに表示されないようにします。
于 2012-10-08T09:45:51.063 に答える
3

class.m ファイルでプロパティを宣言できるため、getter メソッドと setter メソッドはそのクラスでのみアクセスできます。例:

MyClass.h

@interface MyClass : NSObject {
    NSMutableArray *_myArray;
}
@end

MyClass.m

@interface MyClass ()
    @property(nonatomic, retain) NSMutableArray *myArray;
@end


@implementation MyClass

[... MyClass implementation ..]

@synthesize myArray = _myArray;
@end

したがって、「myClass.h」ファイルでのみ「self.myArray」を使用できます。

于 2012-10-08T09:48:09.207 に答える