0

重複の可能性:
cocoa object-c クラスの変数の前にあるアンダースコアはどのように機能しますか?
self.ivar と ivar の違いは?
アンダースコア プレフィックス付きの合成されたプロパティと変数: これはどういう意味ですか?

オブジェクト c でプロパティを使用するには、2 つの選択肢があります。どちらを使用すればよいでしょうか?

選択 1: self.property = xxxx;

選択肢 2: _property = xxx

例えば:

//.h file

@interface ViewController : UIViewController

    @property (retain, nonatomic) NSArray *myArray;

@end

//.m file

@interfaceViewController ()

@end

@implementation ViewController

- (void)doing {

    _myArray = [[NSArray alloc] init]; //choice one
    self.myArray = [[NSArray alloc] init]; //choice two
}
@end
4

2 に答える 2

2

あなたは2つのまったく異なることをしています。

_myVar = [[NSArray alloc] init];

上記のコードでは、変数に直接アクセスしています。

self.myVar = [[NSArray alloc] init];

上記のコードでは、setter メソッドを呼び出しています。これは次と同等です。

[self setMyVar:[[NSArray alloc] init]];

通常、setter は (getter とともに) メモリ管理と同期機能を提供するため、ivar に直接アクセスするよりも、setter を使用する方が一般的に安全です。

アンダースコア構文は、ivar とプロパティを混同しないようにするための規則にすぎません。典型的な間違いは、それと間違えて誤ってmyVarの代わりに使用することだからself.myVarです。アンダースコア構文を使用することは、その悪い習慣を思いとどまらせる試みです。

于 2012-12-17T03:50:29.593 に答える
0

この質問は頻繁にあることを知っていますが、とにかく答えます。

アンダースコア構文はプロパティをサポートするインスタンス変数にアクセスしますが、ドット構文はアクセサリ メソッドの単なるラッパーです。

object.property == [object property]
object.property = x == [object setProperty:x]

そのため、可能な限りドット構文またはアクセサリ メソッドを使用して、すべてが確実に処理されるようにする必要があります。たとえば、非 ARC アプリのガベージ コレクションです。初期化、割り当て解除、カスタム アクセサリ メソッドなどにはインスタンス変数を使用する必要がありますが、これらは特殊なケースです。詳細な概要については、Objective-C マニュアルのプロパティに関する章を参照してください: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/ doc/uid/TP40011210-CH5-SW1

于 2012-12-17T03:50:12.760 に答える