Edited at

Modern Objective-Cでのシンプルなプロパティ記述方式

More than 5 years have passed since last update.

今月からようやくModern Objective-Cに着手(かなり今さらだけど・・)

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

Modern Objective-cのプロパティ記述

一応、メンバー変数とか本当に定義されているのか確認。

Modern Objective-cのプロパティ記述の確認

もう"Legacy" Objective-Cでは書けないな。


参考サイト

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


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


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


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



1.プロパティに対応するインスタンス変数はヘッダファイルで宣言する必要はまずない。(iOSのバージョンに関係なく)

2.プロパティに対応するインスタンス変数はsynthesizeで常に別名をつけるべき。

3.インスタンス変数名はプロパティ名の前に_をつけたものにする。

4.インスタンス変数にアクセスするときは、クラス内からでも常にアクセッサメソッドを通して行うようにする。(setter/getter内やinit, dealloc以外)


参照 : Modern Objective-Cでのプロパティ記述

追記1 : 文章の補足と参考サイトを追加しました。