可能性の重複:あなたは
foo_
を持っているし、次にプロパティfoo
interface
で
How does an underscore in front of a variable in a cocoa objective-c class work?Objective Cの中にfooとfoo_の違い
。実装には@synthesize foo = foo_
があります。 foo
とfoo_
の違いは何ですか?
可能性の重複:あなたは
foo_
を持っているし、次にプロパティfoo
interface
で
How does an underscore in front of a variable in a cocoa objective-c class work?Objective Cの中にfooとfoo_の違い
。実装には@synthesize foo = foo_
があります。 foo
とfoo_
の違いは何ですか?
@synthesize foo = foo_
は、コンパイラはあなただけfoo
を使用する場合は、その保持カウントと混乱をmistakinglyないように、これが行われ、エラーを発生させ...
ので、それははるかに少ない可能性がありますあなたは
foo = something; .
より
_foo = something ;
を行います
Appleはあなたが適切なsetterメソッドを使用したい。.. すなわちself.foo =何か
@property SomeType *foo;
...
@synthesize foo = _foo;
は@property
foo
を作成しますが、その値は_foo
という名前のIVARに保存されている、いないfoo
。
あなたはこのよう@propertyにアクセスし、次のとおりです。
yourObject.foo = someValue;
しかし、あなたのクラスの実装では、あなたが_foo
、ないfoo
と直接IVARにアクセスします。 Shubhank氏によれば、代わりに代わりに@property
foo
を代わりに使用したい場合に、誤ってivar _foo
にアクセスするのが難しくなります。
代わりに@synthesize foo;
がある場合は、@property
とivarの両方がfoo
となります。あなたが明示的にSomeType *_foo
宣言した場合
さて、Novargはケース内@property
様のために使用されることを言及し、その後、あなたは新しいものを作成するのではなく、既存のIVAR _foo
を使用するようにコンパイラを取得するために@synthesize foo = _foo
を行う必要があると思いますfoo
という名前です。しかし、そうしなくても、上の2行のコードを使うだけで、コンパイラはivarを自動的に宣言しますSomeType *foo
。
@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に代入していることを確認することができ、および関連するメモリのセマンティクスを認識する必要があります。
宣言:
@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プロパティでは、その差はあまり重要ではありません。どちらの場合でもメモリ管理は自動的に処理されます。