10

重複の可能性:
cocoa object-c クラスの変数の前にあるアンダースコアはどのように機能しますか?

以下のように合成した後、変数名で自己またはアンダースコアを使用することに非常に混乱しています。

In .h file:
@property(nonatomic, strong) NSMutableArray *users;

In .m file:
@synthesize users = _users;

を使用するときの私の理解に基づいてself.users、OSはsetメソッドで以前に割り当てられたメモリを確実に解放するため、明示的に注意する必要はありません。

_usersユーザーのインスタンス変数であり、通常は users 変数にアクセスするときに使用する必要があります。その値を変更するために使用_usersすると、KVOデリゲートが起動されず、ユーザーの値の変更を監視するクラスに通知されません。

また、self.users以下のようにメソッド名でダミー変数を区別することができます。

- (void)assignUsers:(NSMutableArray*)users {
      self.users = users;
}

or を使用しているときに間違っている、または不足していることを理解したことがあるかどうか誰かに教えてもらえます_usersself.users?

4

3 に答える 3

31

を使用しているときはself.users、setter または getter を介してプロパティにアクセスします。

を使用している場合は_users、setter または getter をスキップしてプロパティに直接アクセスします。


ここにそれの良いデモンストレーションがあります:

- (void)setUsers:(id)users {
    self.users = users; // WRONG : it causes infinite loop (and crash), because inside the setter you are trying to reach the property via setter
}

- (void)setUsers:(id)users {
    _users = users; // GOOD : set your property correctly
}

ゲッターの場合もこれがポイントです。


基本的なメモリ管理について (MRRまたはの場合ARC):オブジェクトのポインタをどのように解放しても、iOS は、オブジェクトを存続させる強力なポインタがなくなると、オブジェクトの割り当てを解除します。

于 2012-08-29T10:27:59.887 に答える
8

プロパティがコンパイラによってどのように実装されるか (または実装される可能性があるか) を検討すると役立つと思います。

あなたが書くときself.users = array;、コンパイラはこれをに変換し[self setUsers:array]; ます あなたが書くときarray = self.users;、コンパイラはこれをに変換しますarray = [self users];

@synthesizeオブジェクトに ivar を追加し (自分で追加した場合を除く)、-usersおよび-setUsers:アクセサー メソッドを実装します (独自の を提供しない場合) 。

ARCを使用している場合、-setUsers:次のようになります。

- (void)setUsers:(NSArray *)users
{
    _users = users; // ARC takes care of retaining and release the _users ivar
}

MRCを使用している(つまり、 ARCが有効になっていない) 場合は、-setUsers:次のようになります*:

- (void)setUsers:(NSArray *)users
{
    [users retain];
    [_users release];
    _users = users;
}

* -これは単純化された非アトミックな実装であることに注意してください-setUsers:

于 2012-08-29T10:50:21.163 に答える
2

はい、それはかなり正しいです。いくつかのマイナーポイント:

ドット表記を使用しているからといって、iOS が自動的にオブジェクトを解放するわけではありません。copyプロパティがorとしてretain(またはstrongARC で)宣言されている場合、オブジェクトを解放します。たとえば、非 ARC コードを使用していて、プロパティが として宣言されてassignいる場合、オブジェクトは解放されません。

開発者ツールチェーンの最新バージョン (Xcode 4.4+) では、プロパティを手動で合成する必要がなくなりました。プロパティは自動的に合成されます (先頭のアンダースコア付き)。

于 2012-08-29T11:49:18.093 に答える