Modern Objective-Cにおけるプロパティの正しい記述法

xcode_logo

大きく変わったObjective-Cのプロパティ記述

今月(2013年4月時点)からようやくModern Objective-Cに着手(かなり今さらだけど・・) 記述がかなりシンプルだとは聞いていて、情報もたくさん挙がっていたのだけど、困惑したのでメモ。メンバー変数とか@synthesizeとか宣言不要でコードがスッキリして嬉しい。基本的には@propertyだけ宣言すれば良いみたい。また@properyもいままでヘッダファイルでのみ宣言していたけど、プライベートなものは実装ファイルの無名カテゴリ内に宣言すればよいみたい(パブリックプロパティは従来通りヘッダファイルに記述)。以下、プライベートプロパティを宣言する時の例。

メンパー変数,synthesizeは省略可能に

modern-objective-c-property

省略しても本当に定義されているか確認

プロパティ記述だけで本当にOKか確認してみる。下記のコードで試してみた所、メンバー変数、ゲッターでもしっかり反映されていることがわかる。メンバー変数、Synthesizeをいちいち設定するのはとても手間だったのでとても嬉しい。。もう”Legacy” Objective-Cでは書けない。

modern-objective-c-property-check

参考サイト

以下、参考にさせていただいたサイトです。

歴史的には、インターフェイスにはクラスのインスタンス変数宣言が必要でした。(中略)インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。

公式ドキュメントです。いままでインターフェイスで宣言してました。公式で実装ブロック内での宣言やプロパティでの自動生成でも可能で、括弧も省略してよいみたい。

コンパイラが@synthesizeを補完してくれる様になったため、基本的な状況では、@synthesizeを書かなくてよくなりました。また、synthesizeされる相手>のivarも、同名の変数ではなくて、アンダーバーを最初に付けた物がデフォルトとなります。これまで議論されて来たことがappleのコンパイラによって、これ>からは定義されているため、安心ですね。ちなみに、これは以前からですが、(strong)というのも,デフォルトがstrongなので、書かなくてよくなりました。

1.プロパティに対応するインスタンス変数はヘッダファイルで宣言する必要はまずない。(iOSのバージョンに関係なく) 2.プロパティに対応するインスタンス変数はsynthesizeで常に別名をつけるべき。 3.インスタンス変数名はプロパティ名の前に_をつけたものにする。 4.インスタンス変数にアクセスするときは、クラス内からでも常にアクセッサメソッドを通して行うようにする。(setter/getter内やinit, dealloc以外)