2012-03-06 1 views

答えて

1
@synthesize foo = foo_ 

は、コンパイラはあなただけfoo

を使用する場合は、その保持カウントと混乱をmistakinglyないように、これが行われ、エラーを発生させ...

ので、それははるかに少ない可能性がありますあなたは

foo = something; . 
より _foo = something ;

を行います

Appleはあなたが適切なsetterメソッドを使用したい。.. すなわちself.foo =何か

1
@property SomeType *foo; 

... 

@synthesize foo = _foo; 

@propertyfooを作成しますが、その値は_fooという名前のIVARに保存されている、いないfoo

あなたはこのよう@propertyにアクセスし、次のとおりです。

yourObject.foo = someValue; 

しかし、あなたのクラスの実装では、あなたが_foo、ないfooと直接IVARにアクセスします。 Shubhank氏によれば、代わりに代わりに@propertyfooを代わりに使用したい場合に、誤ってivar _fooにアクセスするのが難しくなります。

代わりに@synthesize foo;がある場合は、@propertyとivarの両方がfooとなります。あなたが明示的にSomeType *_foo宣言した場合

さて、Novargはケース内@property様のために使用されることを言及し、その後、あなたは新しいものを作成するのではなく、既存のIVAR _fooを使用するようにコンパイラを取得するために@synthesize foo = _fooを行う必要があると思いますfooという名前です。しかし、そうしなくても、上の2行のコードを使うだけで、コンパイラはivarを自動的に宣言しますSomeType *foo

0

@synthesizeディレクティブは、宣言されたプロパティのインスタンス変数を作成するようにコンパイラに指示します。例えば

、あなたの.hファイルで宣言した場合:

@property (nonatomic, retain) NSString *foo; 

とあなたインチこれは、プライベートインスタンス変数NSString *fooを生成します

@synthesize foo; 

メートルファイルだけでなく、アクセサメソッド:あなたが使用していない場合は、クラス内の

- (void)setFoo:(NSString *)foo; 
- (NSString *)foo; 

コードは

self.foo = @"bar"; // set through accessor - dot notation 
[self setFoo:@"bar"]; // set through accessor - method notation 

foo = @"bar";   // direct assignment 

のように見えるかもしれませんARCでは、保持された文字列の代わりにオートレリースされた文字列を割り当てるので、2番目の例は安全ではありません。これは解放され、アクセスするとクラッシュするぶら下がったポインタが残されます。 おそらく何をするつもりだったかは、アクセサを使用するか、オブジェクトを割り当て時に保持することでした。あなたがやっていることは代わりにプライベートインスタンス変数NSString *_fooを作成するには、コンパイラを語っている

@synthesize foo = _foo; 

:あなたの.mファイル内の別の変数を宣言することでfoo = [@"bar" retain];

アクセッサメソッドを使用する場合とインスタンス変数を直接アクセスする場合には、アンダースコアによってインプリメンテーションがより明確になります。特にドット表記を使用する場合。上記の例のように、コードは次のようになります。

_foo = @"bar";  // direct assignment 

あなたは即座にあなたが直接IVARに代入していることを確認することができ、および関連するメモリのセマンティクスを認識する必要があります。

0

宣言:

@interface MyClass 
{ 
    MyOtherClass *foo_; 
    ... 
} 
... 

foo_変数インスタンスを宣言する。宣言:

@interface MyClass 

@property (retain) MyOtherClass *foo; 
... 

fooプロパティを宣言します。ここでプロパティは、セッター- (void) setFoo:(MyOtherClass *)obj)とゲッター- (MyOtherClass *) foo)の2つのメソッドを宣言するための省略形です。プロパティは通常(常にではありません)インスタンス変数に基づいており、コンパイラに@synthesizeを使用してセッター&ゲッターを書き込む場合、バッキング変数(プレXCode 4.4)はプロパティと同じ名前を持ちます。声明:

@synthesize foo = foo_; 

はバッキング変数として変数foo_を使用するが、セッター&ゲッターを書き込むようにコンパイラに指示します。

fooはプロパティの名前で、ドット表記(myClassInstance.foo)で使用されるか、通常はセッターまたはゲッター(例:[myClassInstance foo])を直接呼び出して使用されます。 foo_はインスタンス変数の名前であり、矢印の表記を使用してアクセスします(たとえば、クラス内でself->foo_、クラス外でmyClassInstance->foo_)。アクセスできない場合はself->を削除できます。

独自のカスタムセッター/ゲッターを書いている場合、またはマニュアルメモリ管理と合成済みの保持またはコピープロパティを使用している場合は、セッター/ゲッター、したがってカスタムコードまたは合成を渡すことで差が巨大ですfoo_メモリ管理コード。

ARCまたはGCで合成されたretain/strong/weak/copyプロパティでは、その差はあまり重要ではありません。どちらの場合でもメモリ管理は自動的に処理されます。

関連する問題