2

スレッド「メモリの管理方法」で、著者は「KVO をトリガーしたり、他の副作用が発生したりする可能性があるため、init と dealloc で完全な形式は使用しません」と述べています。意味がわかりませんでしたか?

ソースはこちらhttp://inessential.com/2010/06/28/how_i_manage_memory

4

2 に答える 2

1

著者は命名規則にもっと注意を払うべきだと思います。

@property (nonatomic, retain) NSString *something;

に合成する必要があります

@synthesize something = _something;

このようにself.somethingして、アクセサー メソッド_somethingを使用するか、そのプロパティをサポートする ivar を使用するために参照できます。エラーが起こりにくいです。

そして、あなたの質問について。アクセサーがある場合、そのアクセサー メソッドでそのプロパティを設定する以外に、おそらく別のことを行っています (別のオブジェクトに通知したり、UI を更新したりするなど)。そして、おそらくinitまたはdeallocでそれをしたくないでしょう。そのため、代わりに ivar に直接アクセスしたい場合がありますが、常にそうであるとは限りません。

于 2013-04-11T12:09:46.793 に答える
0

彼は、自己表記を介して @properties にアクセスすることについて言及しています。プロパティを合成すると、その変数のゲッターとセッターが自動的に作成されます。

@property (nonatomic,strong) MyClass myVar;

@synthesize myVar = _myVar;

- (MyVar *)myVar
{
   return _myVar;
}

- (void)setMyVar:(MyClass *)myVar
{
  _myVar = myVar;
}

これらのメソッドは、プロパティが定義および/または合成されるときにバックグラウンドで作成されます (Xcode のバージョンによって異なります)。

だからあなたがするとき

self.myVar = 5;

実際にやっている[self setMyVar:5];

ただし、変数に直接アクセスし、次の表記法を使用してセッターをバイパスすることは可能です。

_myVar = 5;

例:

@property (nonatomic,strong) MyClass myVar;

@synthesize myVar = _myVar;


 - (void)someMethod
{
    // All do the same thing
    self.myVar = 5;
    [self setMyVar:5];
    _myVar = 5;
}

この記事の著者は、dealloc および init メソッド内で getter および setter を使用せず、_myVar表記法を使用して変数に直接アクセスすることを推奨しています。

ベスト プラクティスなどに関する詳細については、この回答を参照してください

于 2013-04-11T12:08:39.863 に答える