2012/03/27

インスタンス変数の定義はプロパティ宣言が自動生成してくれる:Objective-C

いろんなサンプルプログラムを見ているとクラスを定義する際のインスタンス変数の定義部分で色々な定義のされ方があって混乱したので、調べてみた。

そもそもは

インスタンス変数はクラス定義の.hファイル内の@interfaceから始まるコンパイラディレクティブ内の{}の中に記述する、とういうのが基本でした。が、Objective-C2.0からコンパイラがclang(詳細についてはエントリ末尾の参考サイト参照)になって賢くなった、ということらしく、プロパティで変数が宣言されていれば自動生成させるだけでOK、ということになったそうです。

なので、これまではインスタンス変数を宣言しつつ、プロパティでももう一回インスタンス変数についてのプロパティ宣言をしていたのですが、{}内の記述は消しちゃってもいい、といよりもむしろ{}ごと消しちゃいなさい、ということみたいです。具体的には下記みたいな感じです。

これまでは

@interface hogehoge : NSObject
{
    NSString *str1 ;  //インスタンス変数str1を定義
    NSString *str2;   //インスタンス変数str2を定義
}

@property (nonatomic) NSString *str1;  //str1のプロパティ宣言
@property (nonatomic) NSString *str2;  //str2のプロパティ宣言
@end

Objective-C2.0以降は

@interface hogehoge : NSObject
@property (nonatomic) NSString *str1;  //str1のプロパティ宣言
@property (nonatomic) NSString *str2;  //str2のプロパティ宣言
@end
すっきり!

また、上にも書きましたが、基本的にプロパティ宣言で済んでしまった場合は{}も消しましょう、ということみたいです。 iOS Developer Libraryの「Objective-C プログラミング言語」ファイルのP.35にも下記のように書いてあります。
歴史的には、インターフェイスにはクラスのインスタンス変数宣言が必要でした。(中略)インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。
プロパティ宣言が必要ないインスタンス変数を定義したい場合にはヘッダファイル(.hファイル)に書くのではなくて、実装ファイル(.mファイル)内の@implementation内に{}を追加してその中に記述するのが今風(?)みたいですw


参考サイト

イマドキっ子の Objective-C | cockscomb.info
Objective-C入門その7:アクセサメソッドをマスターする|サルにもできるiPhoneアプリの作り方
Clang - Wikipedia

0 件のコメント:

コメントを投稿