今回はObjective-C 2.0から実装された新機能についてのお話です。
前回まで、クラス、インスタンス変数、メソッドと、宣言シリーズについてお話ししてきました。
もう1回復習したい方はこちらを読んでくださいね。
Objective-C入門その4:クラス宣言をマスターする
Objective-C入門その5:インスタンス変数宣言をマスターする
Objective-C入門その6:メソッドの宣言と実装をマスターする
これをクリアしたみなさまは、まず最初の難関を突破したことになります。
中身はともかくとして、
とりあえず各種宣言ができるようになったことで、
アプリケーションの設計がぼんやりとできるようになっています。
ホントに?
ホントに。
例えば、このブログで度々登場している、
「ボールが次々出てきて跳ねる」アプリケーションをiPhoneで作りたくなったとしましょう。
アナタはなーんとなく考えます。
・ボールの色と大きさを変えたいな。。。
・数も自由に増やしたり減らしたりしたいな。。。
・傾けた方にボールが落ちていくと面白いな。。。
・画面の端で跳ね返らせたいな。。。
それを、とりあえずクラスという形にしてみましょう。
// ボールクラスの宣言
@interface ボール:スーパークラス{
// インスタンス変数の宣言
ボールの色
ボールの大きさ
ボールの場所(座標)
}
// メソッドの宣言
iPhoneの傾きから自分の移動方向と速度を決めるメソッド
自分と壁との衝突判定をするメソッド
@end
なんとなーく。ボールクラスの大枠が見えてきませんか?
細か~いインスタンス変数の持ち方とか、メソッドの作り方とか、
それは当然精緻化していかないとダメなんです
が
基本的に。
クラスの形にまで落とすことができれば、アプリケーションは作れます。
カワサキタカシ曰く。
コレがいわゆる「外部設計」とか「基本設計」とか言うレベルで、
夢と現実の境界線です。
虎とかライオンとかマナブ君とか、
そんな例えでもとにかくきっちりと理解しておけば良いお話なのですが、
システム屋さんでも、特に上流行程をやっている人ほどスルーしている傾向が強いです。
業務コンサル、SE、及びプログラマーがケンカする理由
はこの辺にありますので、特にバリバリのプログラマー以外の方、覚えて帰ってくださいね。
————————–
脱線で1回分終わってしまいそうです。しめしめ。
戻します。
本日は、アクセサのお話です。
こっちから見た方が簡単なので、はい、どん!
@propertyと書いているこの2行に注目してください。
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) MyViewController *myViewController;
それと、どん!
同じく@synthesizeと書いてきたこの2行。
@synthesize window;
@synthesize myViewController;
@propertyと@synthesize。
前にくっついているコンパイラディレクティブが違いますが、
windowとmyViewControllerは同じ。
アヤシイですね。
「セットじゃない?コレ」と思ったアナタ。
大正解。
コレ×2、
アクセサメソッドの自動生成用コンパイラディレクティブなんです。
アクセサメソッドノジドウセイセイヨウコンパイラディレクティブ?
。。。
さーて。
例えてどん!のコーナー。始めましょうか。
マナブ君の話を思い出してみましょう。
彼は数字カウント用の指、つまり、インスタンス変数を持っているというくだりがありました。
Objective-C入門その5:インスタンス変数宣言をマスターする
今マナブ君は先生から言われた計算をしています。
1+3+5-4=
さーて、答えを言おうかというまさにその時、
隣に座っているケイコちゃんが
マナブ君の指をグワッ!と3本にぎってしまいました。
先生「まなぶくーん、答えはー?」
マナブ君「2ほーん!」
ブー。
マナブ君は「指」という「インスタンス変数」に入っている値を答えることしかできません。
「指」が「正解」なので、ケイコちゃんに邪魔されたら即OUTなわけです。
つまり、
彼に正しく計算をさせたいのであれば、
「先生以外は彼の指を曲げ伸ばしさせられない」
というブロックが欲しい、ということになりますね。
この、インスタンス変数へのアクセス制御のために、
・セッターメソッド(インスタンス変数にデータを格納するメソッド)
・ゲッターメソッド(インスタンス変数からデータを取得するメソッド)
という2つのメソッドが用意されています。
「インスタンス変数SET専用メソッド」と「インスタンス変数GET専用メソッド」ということです。
「インスタンス変数にアクセスするメソッド」ということで、
まとめてアクセサメソッドと言います。
本日のお題が出てきましたね。
さて、本来でしたらここでアクセサメソッドの書き方をお話しするところなのでしょうが、
しません。というより、しなくても良くなりました。
Objective-C 2.0という現在のObjective-Cでは、
アクセサメソッドを自動生成してくれるコンパイラディレクティブが用意されているからです。
それがコレ。
@property
@synthesize
2つでセットです。
宣言部分に@propertyを、実装部分に@synthesizeを書いておくと、
実行時に自動的にアクセサメソッドを生成してくれます。
「なんだよ。結局2つも書くなんて面倒だな。」
と思ったアナタ。
セッターメソッドとゲッターメソッドを書く方が遥かに面倒だったんです。
オートマとマニュアルくらいの違いです。
コレ作ったエラい人に感謝してこっちの書き方を覚えましょう。
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) MyViewController *myViewController;
@property(?)インスタンス変数型 インスタンス変数名;
@synthesize window;
@synthesize myViewController;
@synthesize インスタンス変数名;
@synthesizeの方はインスタンス変数名を書いておけば良さそうなので簡単ですが、
@propertyの(カッコ)の中は何でしょう?
実はコレ、インスタンス変数の取り扱い方法を指定しています。
nonatomic : 複数のスレッドから同時に読み込まれたら動作保障しないよ
retain : これから自分が使うから勝手に解放しちゃいかんよ(テン・シー・シー参照)
他にも
readonly : 取得のみ可能
readwrite : 取得/格納可能
assign : 格納時は単純代入して
copy : 格納時にオブジェクトのコピーを使ってね
詳しくはこちらのページ。オフィシャルなので言葉超難解デスケド。
ADC プロパティの宣言と実装
retain,assign,copyの違いは今後詳しく見ていきますので、とりあえず書き方だけ覚えましょう。
それと、カンマはタダの区切りで、必ず2個書かないといけないものではありません。
つまり!(グズグズ感吹き飛ばし用つまり)
「【Window】っていう【UIWindow型】のインスタンス変数にアクセスよろしく」
「【myViewController】っていう【myViewController型】のインスタンス変数に
アクセスよろしく」
です。
無理矢理ですが。読めましたね。
「セキュリティのお作法」のお話ですので、手続きが若干複雑になります。
とはいえ、サンプルプログラムの中でこう書かれているということは、
「インスタンス変数へのアクセサはこう書いておけば大丈夫」
ということです。
この長さなら楽勝で覚えられます。。。よね!
それでは、今回はここまで。
今回はインスタンス変数の延長でしたので、
次回はメソッドの延長を少しお話しします。