イマドキの流行に敏感なキミだったらもう知ってるかもだけど、今日はそういうのに鈍感なオジサンたちのために、今風の Objective-C について書いちゃうよ。もちろん互換性的な感じで、すぐに変えられないかもってコもいると思うけど、知っててもソンじゃないから、いま覚えとこう!それとこういうのって、けっこー変わっていくものだから、半年後とかにはもう流行後れになるから注意してね!
インスタンス変数
Objective-C のインスタンス変数と言えば、ヘッダの @interface
に書くというのがこれまでのルールでした。典型的な例として、以下のように書いていました。
@interface MyObject : NSObject { NSString *aString; } ... @end
今風には、インスタンス変数の宣言は実装部の @implementation
に書きます。
@implementation MyObject { NSString *aString; } ... @end
宣言済みプロパティの場合は自動生成されますから、書く必要はありません。外部からアクセスする際にはアクセサを通すべきで、普通はプロパティを使いますから、インスタンス変数は隠蔽しておきます。
これらについて Apple の日本語ドキュメントにも書いてあります。『Objective-C プログラミング言語』の35ページ、クラスインターフェースの注記として書かれた部分には以下のようにあります(強調は筆者による)。
インスタンス変数は実装詳細であり、通常、クラス自身の外からアクセスされることはありません。さらに、実装ブロック内に宣言すること、あるいは宣言済みプロパティから自動生成させることも可能です。したがって通常は、インスタンス変数宣言をパブリックインターフェイスで行うべきではないので、波括弧も省略してください。
また37ページのクラス実装の項に、実装ブロックでのインスタンス変数の宣言について書かれています。
プライベートメソッド
Objective-C でインターフェース部に宣言しない局所的なメソッドを実装するには、カテゴリを用いるのが常識でした。ヘッダにはメソッド宣言を書かず、実装部のすぐ前に無名のカテゴリを作って、そこでメソッドの宣言をしていました。これまではメソッドの宣言をしない場合、メソッドの定義より前でメソッドを呼び出そうとするとコンパイラが警告を出していたためです。このあたりのことは荻原先生の『詳解 Objective-C 2.0』などでも取り上げられています。
ここで、先ほどの Apple 公式ドキュメント『Objective-C プログラミング言語』を参照してみます。36ページにインターフェースの役割として以下のような記述があります(強調は筆者による)。
メソッド宣言のリストを通して、インターフェイスファイルはほかのモジュールに、どのようなメッセージをクラスオブジェクトとクラスインスタンスに送信できるかを知らせます。クラス定義の外部で使用できるすべてのメソッドを、インターフェイスファイルで宣言します。クラス実装の内部で使用するメソッドは省略できます。
単に省略できる、と書いてあります。実際に省略すると、Xcode の設定で Apple LLVM コンパイラを選んだときは警告が出ません。コンパイラが clang になって賢くなったと言うことでしょうか。
もちろんサブクラス化したとき不用意にオーバーライドしてしまわないように、メソッド名に接頭辞を付けるとかそういうことをした方が良いことに代わりはありません。
まとめ
Objective-C もまた進化を続けています。今回取り上げたこと以外にも、変わっていることがまだあるかもしれません。ARC や Blocks のように目立った機能でなければ、残念ながらあまり取り上げられることもありません。ましてランタイムのちょっとした変更などは滅多に話題になりません。流行に乗り遅れないためには日々の勉強が肝要ですね。
ところで Apple の日本語ドキュメント『Objective-C プログラミング言語』がとても参考になることが分かりました。今回参照したのは2011年10月12日の版です。そうそう、日本語ドキュメントの PDF ファイルを一括ダウンロードできるスクリプトを用意したので、使ってみるのも良いですね。Ruby 1.9.x と Nokogiri ライブラリがあれば動きます。
ということで、みんなも objc 力を磨いちゃおう!!
最近@propertyだけになってるテンプレートを見て、何となく心配になっていたオジサンの私には、とても参考になりました! (^^)
やはりドキュメントは常に読んでおかなければダメなんですね…
ピンバック: Objective-C 2.0でのインスタンス変数に関して « Sweden::erasmusLife
というの、別にほかのクラスのオブジェクトであっても
a -> hoge
でアクセス可能な気がする。ピンバック: iPhone・Androidのモックアップ・アプリ開発「モックスマート」 | モックスマートiPhone・Android開発
ピンバック: Xcode4.4から使えるようになった記述法をいまさらと書いた記事をいまさら読む | Morizotter Blog