べーおの備忘録

iOSアプリ開発や生活のことをツラツラと書きます。

property の使い分け方

参考

http://qiita.com/weed/items/2736582eeb404cb2c1e6

 

実はつい最近まで_propertyをどこでも使ってました。

だってself. ってつけるのめんどいんだもん。

アンダーバー入れたらすぐ候補出て早いんだもん。

 

でも、ソースレビューしてもらったら

注意されたのでちょっと調べてみた。

 

ちなみに他人にソースレビューしてもらうのここで初めて。

超我流でやってたので浅はかだし、いわゆるクソコードばかりだったわ・・・

抽象化とかもここ来て初めて意識したわ・・・お恥ずかしい・・・

 

 

(参考引用)

基本的に、

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

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

のが良いでしょう。

 

マジで?

なんで?

 

(参考引用)

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

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

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

 

ほへ~~

 

(参考引用)

独自の getter/setter を作ることで、あるプロパティを読み書きする際に必要な追加の操作を強制できます。

たとえばあるプロパティに値をセットするとき何かのカウンタを必ずインクリメントしなければならないなら、

呼び出し側でカウンタを操作するのではなく独自の setter の中で操作する、ということができます。

 

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

 

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

 

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

 

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

 

 

なんか色々理由はあるけど、

まとめ!

 

setter / getter / init / dealloc メソッド以外は

self.property を使え!

 

こういったベストプラクティスを学ぶのも大切だなーと思いましたとさ。

 

 

では。