Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説
公開日:
:
iOSアプリを書く! iOS, Objective-C, UIKit, Xcode
しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がないと、Xcode 6正式版の登場前にデヴェロッパー登録をしてiOSアプリを配布するという目標が実現しないし。
Objective-Cプログラミングについては、前回までの解説を参照!
というわけで、Objective-CとXcodeの解説として下の6エントリを閲覧済みという前提で入門編を続ける。まあ、読んでも大して人生の得にはならない筈。精読されたし。
- iOSプログラミング入門書では、まず最初のHello, World!すら難しい
- Objective-Cの第一歩(仕切り直し)
- Objective-Cの第三歩 クラスとクラスメソッドを定義する
- Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する
- Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド
- Objective-Cの第六歩 プロトコルの宣言と実装
iOSをターゲットとして新規アプリケーションを作成
Xcodeの新規プロジェクトで、今度はiOSのApplicationを選択しよう。あらかじめアプリケーションのテンプレートが幾つか用意されているけど、この中でEmpty Applicationを選択してプロジェクトを作成する。
作成後のアプリケーションは、左のファイルツリーでアプリケーション名のファイルが選択されている状態のはずだ。アプリケーションの情報などはこの状態で出てくる画面の上部にあるタブ(GeneralとかCapabilitiesとか)を切り替えて、確認したり変更したりする。とりあえず今回は新規アプリケーションを作成したときのコードを確認したいだけなので、ファイルツリーでソースコードファイルを選択して、中身を確認してみよう。
iOSアプリケーションのファイルツリー解説
今回は、Helloという名前のプロジェクトを作成したのだが、OSXのコンソールアプリケーション作成時には無かった、HelloTestsというフォルダが作成されている。これはXCTestというユニットテスト用のフレームワークが使うフォルダなのだけれど、とりあえず無視しよう。なおXCTestはXcode 5からの機能である模様。
プロジェクト名と同じ名前のHelloフォルダの中に、フォルダが2つある。Images.xcassetsというフォルダは、これもXcode 5から導入された仕組みで、Retina/非Retinaの画像を一元管理する仕組み。Supporting Filesフォルダは、アプリケーションの設定ファイル等を入れておくフォルダ。そして、大切なmain.mがこんな所に入れられている。お蔵入りしているように見えるけれど、最初に呼ばれるファイル(エントリポイント)としての役割は変わらない。ただ、iOSアプリを作る際にこのmain.mに直接何かを書き込むことはないだろう。というのも、main.mの中で行っていることは、mainループのエントリポイントとしての役割をUIApplicationMainというメソッドに渡すことだけ。
UIApplicationMainとは?何をやっているの?
このUIApplicationMainというメソッドはどこで宣言され、実装されているのだろうか。Xcodeの左サイドバー上の虫眼鏡アイコンで、検索範囲にプロジェクトの構成ファイルとフレームワークも含んだ検索をする。すると、UIApplication.hというファイルに該当があるということがわかる。main.mの頭でUIKit/UIKit.hを読み込んでいるけれど、このUIKitというフレームワークにUIApplication.hは含まれているわけだ。
UIKitというフレームワークは、iOSアプリケーションのユーザインターフェースのイロイロな機能を実現するフレームワークで、OSXならばUIKitでなくAppKitとなる。Xcodeの左サイドバーのファイルツリーをを掘っていくと、Frameworksというフォルダの下に入っているのだけれど、公開されているのはクラスの宣言(.h)だけ。したがってUIApplication.mの中でUIApplicationMainがどのような実装になっているのかは確認できない。
しかしながら、メソッドの宣言(とコメント)だけ見れば分かるように、第4引数として与えられた名前のdelegate classをインスタンス化している。
main.mでのこのメソッドの呼び出され方を見ると、AppDelegateをインスタンス化しているようだ。AppDelegateならば、宣言も実装も公開されている!
では、AppDelegateとは?何をやっているの?
AppDelegateクラスは、Helloフォルダの直下にAppDelegate.hとAppDelegate.mが作成されている。これがどうやらiOSアプリケーションの鍵となるようなので、中身について見ていこう。
AppDelegate.hから分かることは、AppDelegateはUIResponderというUIKitの中のクラスを継承しつつ、UIApplicationDelegateというプロトコルを採用している。また、UIwindowクラスのwindowというオブジェクトをプロパティとして作成している。
実装部のAppDelegate.mでは、主にコメントが書かれたメソッドが6つほど存在する。
AppDelegate.hの中で宣言されていなかったこれらのメソッド、さては親クラスかプロトコルの中で宣言されたメソッドだな、と想像がつくだろう。そこでメソッド名を再び検索にかけてみると、UIKitのUIApplication.hファイルの中で、UIApplicationDelegateプロトコルのメソッドとして@optionalで宣言されているということが分かる。つまり、AppDelegate.m内でメソッドの実装が任意でできる。コードを加えても良いし加えなくても良い。いやあ、これを説明するためにObjective-Cの解説を6回も続けたのだよ。
AppDelegateの中のメソッド解説
では、それぞれのメソッドが何を表しているのか見てみよう。
applicationメソッド
このメソッドは、引数を2つ受ける。UIApplicationMainの中で、アプリケーションが立ち上がったタイミングにフックして呼ばれている(WordPressのフック関数と考えると分かり易いでしょう?)。したがって、アプリケーションの起動時に行いたい処理をここに書くことになる。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; } |
Empty Applicationを作成した時に最初から書いてある処理は、宣言部で宣言したwindowプロパティにUIWindowクラスのインスタンスを入れる処理である。イニシャライズメソッドのinitWithFrameでは、UIScreenクラスメソッドのmainScreenでデバイスの画面オブジェクトを取得して、そのサイズを表すboundsプロパティを(アクセサ経由で)取得して、代入している。
その次、windowのbackgroundColorプロパティを、UIColorクラスのクラスメソッドwhiteColorが返す色に設定している。UIColorクラスには、こういった「○○色って(RGBで)どんな色?」と聞くと教えてくれるメソッドがいくつか揃っている。
最後に、windowを実際に表示するmakeKeyAndVisibleというメソッドを送っている。全て成功したら、ブーリアン値のYESが返る。
applicationWillResignActiveメソッド
アプリケーションが着信などの割り込みのせいで、アクティブの状態からインアクティブになる際に呼ばれる。勿論、電話が終わるなどして再びアクティブになることが予想されるが、その際にはapplicationDidBecomeActiveメソッドが呼ばれる。
applicationDidEnterBackgroundメソッド
アプリケーションがバックグラウンドにまわった際に呼ばれる。バックグラウンド状態とは、バックグラウンド実行ないしサスペンドの状態を総称する。アプリケーション実行中にホームボタンを押しても、すぐにアプリケーションが終了するわけではなく、処理の実行を続けることもできる。その際には、applicationWillTerminateの代わりにこのメソッドが呼ばれる。
applicationWillEnterForegroundメソッド
アプリケーションがバックグラウンドからフォアグラウンドに復帰する際に呼ばれる。
applicationDidBecomeActiveメソッド
着信割り込みなどでインアクティブになっていた状態から復帰した際に呼ばれる。
applicationWillTerminateメソッド
アプリケーションが終了される際に呼ばれる。バックグラウンド状態のアプリケーションも、デバイスのメモリが足りなくなり次第終了させられるのだが、そのタイミングにも呼ばれる。
既にiOSアプリケーションは完成している!
以上のような状態が、新規アプリケーションの作成をした状態だが、この状態でも既にiOSアプリケーションとして完成している。コードを1行も足すことなく、ProductメニューからRunを選んでみる。するとiOSシミュレータが立ち上がって、仮想環境で立派にアプリケーションとして動いているのが確認できる筈だ(何もしないけど)。
こうして表示されているのが、AppDelegate.mの中のapplicationメソッドの実装でつくられた、サイズと背景色を指定されたwindowだからこそ真っ白な画面になっているわけだ。つまり、今後はAppDelegate.mの中にコードを追加して機能を増やすことになる。ワクワクするね!
関連記事
-
Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する
前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション
-
Objective-Cでは何故.hファイルと.mファイルを作成させられるのか
前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書い
-
Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!
Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel
-
iOSプログラミング入門書では、まず最初のHello, World!すら難しい
Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH
-
Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド
前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成
-
Objective-Cの第六歩 プロトコルの宣言と実装
Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま
-
Objective-Cの第三歩 クラスとクラスメソッドを定義する
Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H
-
Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成
前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコー
-
Objective-Cの第一歩(仕切り直し)
前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、
-
Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する
Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで