スレッド「メモリの管理方法」で、著者は「KVO をトリガーしたり、他の副作用が発生したりする可能性があるため、init と dealloc で完全な形式は使用しません」と述べています。意味がわかりませんでしたか?
ソースはこちらhttp://inessential.com/2010/06/28/how_i_manage_memory
スレッド「メモリの管理方法」で、著者は「KVO をトリガーしたり、他の副作用が発生したりする可能性があるため、init と dealloc で完全な形式は使用しません」と述べています。意味がわかりませんでしたか?
ソースはこちらhttp://inessential.com/2010/06/28/how_i_manage_memory
著者は命名規則にもっと注意を払うべきだと思います。
@property (nonatomic, retain) NSString *something;
に合成する必要があります
@synthesize something = _something;
このようにself.something
して、アクセサー メソッド_something
を使用するか、そのプロパティをサポートする ivar を使用するために参照できます。エラーが起こりにくいです。
そして、あなたの質問について。アクセサーがある場合、そのアクセサー メソッドでそのプロパティを設定する以外に、おそらく別のことを行っています (別のオブジェクトに通知したり、UI を更新したりするなど)。そして、おそらくinitまたはdeallocでそれをしたくないでしょう。そのため、代わりに ivar に直接アクセスしたい場合がありますが、常にそうであるとは限りません。
彼は、自己表記を介して @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
表記法を使用して変数に直接アクセスすることを推奨しています。
ベスト プラクティスなどに関する詳細については、この回答を参照してください。