*

Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説

公開日: : iOSアプリを書く! , , ,

しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がないと、Xcode 6正式版の登場前にデヴェロッパー登録をしてiOSアプリを配布するという目標が実現しないし。

Objective-Cプログラミングについては、前回までの解説を参照!

というわけで、Objective-CとXcodeの解説として下の6エントリを閲覧済みという前提で入門編を続ける。まあ、読んでも大して人生の得にはならない筈。精読されたし。

iOSをターゲットとして新規アプリケーションを作成

Xcodeの新規プロジェクトで、今度はiOSのApplicationを選択しよう。あらかじめアプリケーションのテンプレートが幾つか用意されているけど、この中でEmpty Applicationを選択してプロジェクトを作成する。

iOSアプリケーションを選択

iOSアプリケーションを選択

作成後のアプリケーションは、左のファイルツリーでアプリケーション名のファイルが選択されている状態のはずだ。アプリケーションの情報などはこの状態で出てくる画面の上部にあるタブ(GeneralとかCapabilitiesとか)を切り替えて、確認したり変更したりする。とりあえず今回は新規アプリケーションを作成したときのコードを確認したいだけなので、ファイルツリーでソースコードファイルを選択して、中身を確認してみよう。

iOSアプリケーションのファイルツリー

iOSアプリケーションのファイルツリー

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!"アプリケーション

記事を読む

no image

Objective-Cでは何故.hファイルと.mファイルを作成させられるのか

前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書い

記事を読む

no image

Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!

Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel

記事を読む

no image

iOSプログラミング入門書では、まず最初のHello, World!すら難しい

Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH

記事を読む

クラスを継承して作成

Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド

前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成

記事を読む

no image

Objective-Cの第六歩 プロトコルの宣言と実装

Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま

記事を読む

no image

Objective-Cの第三歩 クラスとクラスメソッドを定義する

Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の"H

記事を読む

無理矢理表示したHello, World!

Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成

前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコー

記事を読む

no image

Objective-Cの第一歩(仕切り直し)

前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、

記事を読む

GaussTester実行結果

Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する

Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

no image
Swiftが今年後半を目処にオープンソース化!そしてSwift 2

一時期iOSとOSXの開発からは離れていたけれど、久しぶりの大きなニュ

RunSwiftスクショ
WEB上で動作するSwiftの疑似実行環境 RunSwift・SwiftStub

Swiftの実行環境はMac+Xcode。ウワサのSwift言語に興味

no image
待望のRetina iMacが登場! iOSアプリの開発が楽になる?

10月16日(日本時間17日)に行われたAppleの新製品発表会。大方

no image
Swiftの参考書 電子書籍以外にもボツボツと登場

書店の棚に並んでいるSwift本を見て、正式リリースを実感! 何しろ

no image
Swift1.0を含むXcode6のGMが公開

大体2週間の間隔を空けてbetaのヴァージョンナンバーが上がり続けてい

→もっと見る

PAGE TOP ↑