2

一部のチュートリアルではただ

時間で

@property (readwrite,nonatomic) NSUInteger DirectProp;

メートルで

@synthesize DirectProp;

でも他はこんな感じ

時間で

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}
@property (readwrite,nonatomic) NSUInteger ThrouVarProp;

メートルで

@synthesize ThrouVarProp = throuVarProp;

どの方法が正しいですか?

4

4 に答える 4

2

どちらも正しい...

違いは、古い書き方と新しい書き方にあります。

Xcode の最新バージョンでsynthesizeは、必須ではなく、_yourIvarName として自動的に取得されます。

于 2012-11-12T09:10:00.480 に答える
1

単一の引数で:

@synthesize directProp;

合成されたゲッター/セッターメソッドは、値を格納するために使用されるインスタンス変数と同じように呼び出されます。これは混乱を招く可能性があります。例えば:

self.directProp = YES;

[self setDirectProp:YES];

directProp = YES;

すべて有効です。

追加= ivarのを使用すると、インスタンス変数に名前を付けることができます(慣例では、先頭にアンダースコアを使用します)。これは良い考えなので、混乱することはありません。

@synthesize directProp = _directProp;


self.directProp = YES;

[self setDirectProp:YES];

_directProp = YES;

また、前述のように、新しいランタイムでは、使用前にインスタンス変数を宣言する必要はありません。これも悪い考えであり、怠惰を促進するために存在するようです。いつかこの機能を使用したことを後悔するでしょう...

于 2012-11-12T09:16:01.917 に答える
0

新しいランタイムでは、iVarを定義する必要はありません。実際、彼らはあなたのためにiVarを自動合成することさえします。

// .h
@property (…) Type name;

これにより、次のようにプロパティが自動的に合成されます。

// .m
@synthesize name = _name;

したがって、基礎となる変数にアクセスすることもできますが、基礎となる実装の詳細と見なしているため、お勧めしません。

ゲッターをオーバーライドすると、自動合成が行われなくなることに注意してください。

// .m
@synthesize lazyProperty = _lazyProperty;
- (NSString *)lazyProperty {
    if (!_lazyProperty)
        _lazyProperty = @"Foobar";

    return _lazyProperty;
}
于 2012-11-12T09:14:26.083 に答える
0

どちらも正しいです。

と:

@interface MyClass : CCNode {
    NSUInteger throuVarProp;

}

そのオブジェクトにはNSUInteger 種類のインスタンス変数があることをコンパイラに伝えています。これは正式に正しい場合ですが、@property を使用すると、このコードは Xcode とコンパイラによって自動生成されます。

実装で使用される @syntesize は、ゲッターとセッターを作成します。これは、「外部」からインスタンス変数にアクセスするために使用される特別なインスタンス メソッドです。

最後のXCode(4.4からのAFAIK)では、 @syntesize も自動生成され、次の形式で

@syntesize var = _var;
于 2012-11-12T09:13:19.583 に答える