さてさて。Objective-C入門も8回目を迎えました。今回はメソッドの中身のお話です。
ようやく。
よーやく。
HelloWorldAppDelegateの読解最終章でございます。
長かったここまでの道のり。
谷あり。谷あり。
谷ばかり。
いろいろやってきましたね。
クラス見て、インスタンス変数見て、メソッド見て、アクセサ見て。
Objective-C入門その4:クラス宣言をマスターする
Objective-C入門その5:インスタンス変数宣言をマスターする
Objective-C入門その6:メソッドの宣言と実装をマスターする
Objective-C入門その7:アクセサメソッドをマスターする
サンプルファイルの最初のパーツを読むのに8回分もかかるとは。
恐るべし。iPhoneアプリ開発。
さて、最後に残った部分を見てみましょう。
はい、どん!
メソッドの中身、つまり実装部分が黒々と残ってますね。
見て見ぬ振りを決めこみたいところですが、輝く未来のためです。
ここはもう鼻つまんで口の中に放り込みましょう。
メソッド1個目
MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[aViewController release];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
UIView *controllersView = [myViewController view];
[window addSubview:controllersView];
[window makeKeyAndVisible];
んー。
読めそうで読めない。っていうか読めない。特に1行目。
とりあえず [カッコ] がたくさんありますね。
[カッコ] の謎解きから始めましょうか。
この部分はメソッドの実装部分。
「一連のまとまった機能」の「内容」を書いているところです。
つまり、1行1行何らかの機能について書かれています。
[カッコ] も当然、何らかの機能を指しているハズですね。
よーく [カッコ] の中をみると、2つの単語が対になっています。
[MyViewController alloc]
[aViewController release]
[window makeKeyAndVisible]
などなど。
前が何かで、後ろがそれに関係する何か。
全然わかりませんがきっといつものパターンです。
正解から行きましょう。
正解はこちら。
[オブジェクト名 メソッド名]
ん?ピンとこない?
では、これならどうでしょう。
[マナブ君 指開け]
おお!
[【オブジェクト】さーん【メソッド】してー!]
って言ってるんです。
ほんとかどうか、
片っ端からパターンにハメてみましょうか。
[MyViewControllerさーん allocしてー!]
[NSBundleさーん mainBundleしてー!]
[aViewControllerさーん releaseしてー!]
[UIApplicationさーん sharedApplicationしてー!]
[myViewControllerさーん viewしてー!]
[windowさーん addSubviewしてー!]
[windowさーん makeKeyAndVisibleしてー!]
ほーら。
なんとなくそんな気がしてきませんか。
試しにメソッド名の方を訳してみましょう。
[MyViewControllerさーん インスタンス用のメモリを確保してー!]
[NSBundleさーん バンドルを生成してー!]
[aViewControllerさーん インスタンスを破棄してー!]
[UIApplicationさーん アプリケーションのインスタンスを取得してー!]
[myViewControllerさーん ビューを取得してー!]
[windowさーん サブビューを追加してー!]
[windowさーん サブビューをレンダリングしてー!]
さらにそれっぽくなってきましたね。
ここでは1個1個のメソッドの役割を覚えるのではなく、
[カッコ] が出てきたら自動的に [××さん○○して~] に変換するクセを付けられればOKです。
でも実はコレだけでは全部を読むことはできません。
こんな部分があるからです。
[[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
[window addSubview:controllersView];
[[二重カッコ]] と [:コロン] です。
コロンの方が簡単なので、コロンから行きます。
[オブジェクト名 メソッド名:引数]
覚えてますか?引数の話。
Objective-C入門その6:メソッドの宣言と実装をマスターする
そう。
メソッドを動かす時に、メソッドに渡すことができる値のことでした。
つまり、
UIView *controllersView = [myViewController view];
上で定義した「controllersView」を ↓ 「addSubview」の引数として渡す。
[window addSubview:controllersView];
こういうことをやっているわけです。
では、もうひとつの二重カッコは何でしょう?
まあ、二重ですからね。
2回処理をやってる。
わけです。そりゃぁもう。そうに違いない。
[[オブジェクト名 メソッド名1] メソッド名2]
こんな感じです。内をやって外をやる。ボディ→ストレートです。
[【オブジェクト】さーん【メソッド】してー!] その結果を【メソッド】してー!]
です。
使えるなー。この公式。
誰が考えたんでしょう。そんなサイトご近所さんと連れ立って毎日でも来ると良いと思います。
じゃ、ホントに読めるかやってみましょう。
ホップ
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
ステップ
[[UIApplicationさーん sharedApplicationしてー!] その結果をsetStatusBarStyle(引数 UIStatusBarStyleBlackOpaque)してー!];
ジャーンプ
[[UIApplicationさーん アプリケーションのインスタンスを取得してー!] その結果をステータスバーのスタイルを(引数 黒いタイプ)にしてー!];
読めたー!
やりましたよ。
こんな意味不明な呪文もそれっぽいところまで翻訳コンニャク成功ですよ。
ここまでくれば1行目の激ムズコードにもチャレンジしてしまいましょう。
ホップ
[[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
ステップ
[[MyViewControllerさーん allocしてー!] その結果をinitWithNibName(引数1 @”HelloWorld”)(引数2 bundle:[NSBundleさーん mainBundleしてー!]してー!];
ジャーンプ
[[MyViewControllerさーん インスタンス用のメモリを確保してー!] その結果を初期化(引数1 HelloWorldって名前のXibファイルで)(引数2 xibファイルにアクセスするバンドルはコレ使って:[NSBundleさーん バンドルを生成してー!]してー!];
なんとなく、うっすらと読めた気がしますよね。
しません?
そもそも「ジャーンプの変換ができないよ」って思ってます?
大丈夫です。百パー大丈夫です。
メソッドの意味なんてググればだいたい見つかります。
大事なのは「あとはメソッドの意味を調べるだけ」ってところまで辿り着けるかどうか、
つまり、この変換がパッとできるかどうか。
そっちなんです。
では、残ったメソッド2個目で確認しておきましょう。
メソッド2個目
ホップ
[myViewController release];
[window release];
[super dealloc];
ステップ
[myViewControllerさーん releaseしてー!];
[windowさーん releaseしてー!];
[superさーん deallocしてー!];
ジャーンプ
[myViewControllerさーん インスタンスを破棄してー!];
[windowさーん インスタンスを破棄してー!];
[superさーん インスタンスをホントに破棄してー!];
さらさら流れる小川のやう。
ちょー気持ちエエー。
おつかれさまでした!
とりあえずこれでHelloWorldAppDelegateはほとんど※読めるようになったはずです。
(※だいたいこんな感じーというレベルで)
次回は8回分のまとめも兼ねて、
我々を苦しめてきた
HelloWorldAppDelegateがいったいナニモノだったのか。
解決編とまいりましょう!
真実は、たぶんひとつ!