1

次のように、Objective-C のクラスのプロパティを使用することを好みます (新しい Xcode バージョンでは標準のようです)。

/* MyClass.h */
@interface MyClass : NSObject;
@property (nonatomic, strong) NSArray *myArray;
@end;


/* MyClass.m */
#import MyClass.h

@implementation
@synthesize myArray = _myArray;

- (void)anyMethod {
    self.myArray = // do something
}

@end

ただし、ウェブ上のいくつかの github リポジトリでは、プロパティを使用するさまざまな方法を見つけました。

/* MyClass.h */
@interface MyClass : NSObject {
    NSArray *myArray;
}

// sometimes the @property is used here too

@end;


/* MyClass.m */
#import MyClass.h

@implementation

- (void)anyMethod {
    _myArray = // do something
}

@end

それらの方法の違いは正確には何ですか?インスタンス変数へのアクセスで何かをしなければならないことを読みました。しかし、@interface セクションで変数を宣言し、@property を使用しない (または時々使用する) 人がいるのはなぜでしょうか?

4

3 に答える 3

0

「_varName」は、メモリに格納されている実際の変数を指します。「self.varName...」を使用すると、ドット構文規則を使用して変数を「取得」および「設定」するアクセサを使用するだけです。そうすることで

self.varName = someValue;

また

[self setVarName:someValue];

実際にはメソッドを呼び出しています

- (void)setVarName:(ObjectType *)varName

これは単なる古典的な「セッター」メソッドであり、その変数の値を設定する責任があります。これは、レストランに行ってウェイター/ウェイトレスに注文するのと、キッチンに行って自分で注文するようなものです。

通常、後者は眉をひそめ、アクセサメソッドを使用して「self ...」を使用して値を設定および取得することをお勧めします。これは、通常、適切なデータが格納されていることを「確認」するようにアクセサ メソッドが設定されるためです。これは、値の取得または設定中に他のタスクが実行されるカスタム アクセサーの場合に当てはまります。他の理由もありますが、「保護」が本当に重要なポイントです。

あなたがするとき

_varName = someValue; 

セッターメソッドは使用されず、変数は直接変更されます。

于 2013-10-04T23:40:54.500 に答える
-1
{
 NSArray *myArray;
}

上記のものはメンバー変数と呼ばれ、クラス外からアクセスすることはできません。

@property を作成すると、変数はクラス内だけでなくクラス外でも読み取られます。そのため、セッターとゲッターが自動的に生成されます。

メンバー変数と同じものを宣言する必要はありません..

読みやすさを向上させるために行われ、メモリ管理戦略の重要な要素とも見なされます。

あなたが私有財産について話しているように

A. 完全にプライベートな変数が必要な場合。プロパティを指定しないでください。

B. クラスのカプセル化の外部からアクセスできる読み取り専用変数が必要な場合は、グローバル変数とプロパティの組み合わせを使用します。

于 2013-05-24T08:08:34.320 に答える