Edited at

self.propertyと_propertyの違いと、使い分け方

More than 5 years have passed since last update.

基本的に、

getter/setter/init/deallocメソッドの中でだけ_propertyを使い、

それ以外のときはすべて、self.propertyを使う

のが良いでしょう。

(以下、uasiさんのアドバイスです)

getter/setter の呼び出しコストは微々たるものですので、コストと副作用を考えて _property と self.property を使い分けるより、一律で self.property を使った方が楽です。

_propertyは、値を直接割り当てたり取得することしかできません。

これに対し、self.property[self property]を呼ぶことと同じです。このやり方だと、独自のgetterやsetterをつくることができます。

(以下、uasiさんのアドバイスです)

独自の getter/setter を作ることで、あるプロパティを読み書きする際に必要な追加の操作を強制できます。たとえばあるプロパティに値をセットするとき何かのカウンタを必ずインクリメントしなければならないなら、呼び出し側でカウンタを操作するのではなく独自の setter の中で操作する、ということができます。

また、そのプロパティを持つ(=インスタンス変数を含み、それを直接操作できる)クラスについても、インスタンス変数を触るのではなく常にプロパティを経由するようにすれば、この制約を守ることができます。

object.propertyを呼ぶことは、本質的には[object property]を呼ぶことです。このメソッドをいじることで、独自のgetterやsetterメソッドを使うことができます。


独自のgetterの例

- (Type)property{

return 2*_property;
}


独自のsetterの例

- (void)setProperty:(Type)property

{
_property = 2*property;
}


usaiさんの独自setterの例

- (void)setProperty:(Type)property

{
_property = property;
_howManyTimesPropertySetted++;
}

さらに、self.property形式を使うと、単純に変数の値をsetしたりgetしたりすること以外にも良い点があります。

それは、@property宣言の中で適用させた属性(weakstrongなど)に基づいて@synthesizeが自動的にメモリ・カウンタの増減の有無などを処理してくれることです。

「細かいことは、おまかせ」できるわけです。

(以下、uasiさんのアドバイスです)

ここで言わんとしていることも同じで、自分でカスタムの getter/setter を書いた場合は self.property に追加の効果があるかもよ、ということです。 @property と @synthesize で getter/setter を自動生成した場合も、 @property に指定する属性の内容によっては追加の効果があります。

uasiさん、アドバイスありがとうございました!