ポンクソフト

Single View Applicationで生成されるプロジェクト概要 - iOSアプリ開発メモ

前ページ iOSアプリ開発メモ TOP 次ページ

目次

  1. iOSアプリ開発メモ
  2. インストール・環境構築
  3. はじめてのアプリ
  4. Single View Applicationで生成されるプロジェクト概要
  5. 画像を表示する
  6. タッチすると画像が回転するアプリ

プロジェクトの中身を知る

プロジェクトで何が生成されるかは知らなくても、なんとなくアプリは作成できますが、気になるので少し追いかけることにしました。
興味のない人は飛ばしても構いません。
ここでは以下のようなプロジェクトを生成しました。
ナビゲータウインドウには以下のファイルができました。
navigator.png
Objective-Cでは、ヘッダファイル(クラスやクラス内容を宣言してあるもの)の拡張子が.h、実装ファイル(クラスメソッドの処理内容を記述してあるもの)の拡張子が.mとなります。

main.m

ふつうのC言語と同じく、まず最初にmain関数が実行されますが、その内容はSupporting Filesフォルダのmain.mに記述されています。内容はこのようになっていました。
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
  @autoreleasepool {
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  }
}
一行ずつ見て行きます。
#import <UIKit/UIKit.h>
#import文はC言語の#include文とほぼ同じですが、多重読み込みを防止する機能があるようです。
ここではUIKit.hをインポートしています。iOSのUIを使うためのフレームワークですね。中身を見ると大量の「UI***.h」をインポートしています。
#import "AppDelegate.h"
appDelegateクラスを使うためにヘッダをインポートしています。AppDelegate.mを見るとスマホアプリ特有のたくさんのイベント(アプリが起動した、バックグラウンドへ移行した、終了した、など)が定義してあるので、おそらくここを上書きして自分のアプリ特有の機能を記述するのでしょう。
int main(int argc, char *argv[])
C言語をやっている人にはお馴染みのプログラム開始部分です。アプリが起動したらここがまず動くのでしょう。Objective-Cは関数とメソッドで記述方法が全然違うので少しややこしいです。
@autoreleasepool {
  ・・・
}
iOS5からの新しい機能で、このブロック中で確保されたメモリは、C言語ユーザーにはお馴染み恐怖のメモリリークを防いでくれるっぽいです。ありがたく使わせて頂きます。循環参照の場合は書き方を間違えるとリークするので注意が必要らしいです。
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
これはメソッドではなく関数です。4番目の引数に、アプリを制御するクラスを書くそうです。
[AppDelegate class]
これは配列の添字ではなく、Objective-C特有の(おそらくSmalltalkからの?)オブジェクトへのメッセージ送信方法です。左に書いたオブジェクトの、右のメソッドを呼び出す感じです。しかしAppDelegateはインスタンスを生成していません。なのでclassというのはクラスメソッドになります(インスタンスを生成しなくても使えるメソッド。関数に似てる)。classはクラスのClassクラスを返します?よくわかりませんが、引数で渡すことによってインスタンスをどこかで生成しているのでしょう。

AppDelegate.h

#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
こちらも一行ずつ見て行きます。
@interface AppDelegate : UIResponder <UIApplicationDelegate>
  ・・・
@end
この@interface〜@endの中にクラスの定義を書きます。
「:」の後ろはスーパークラスです。すなわち、AppDelegateクラスはUIResponderクラスを継承していて、UIResponderクラスのメソッドが使えます、と。
UIResponderクラスは反応するもの、つまりUI部品の親玉みたいなものでしょう。

「<UIApplicationDelegate>」この部分はプロトコルと言うらしいです。Javaで言うところのインターフェースに似ているようです。UIApplicationDelegateで定義してあるメソッドの中身を書けば、それぞれのイベントに反応できるようです。
@property (strong, nonatomic) UIWindow *window;
windowという名前のプロパティを定義しています。プロパティとは便利なメンバ変数、フィールドみたいなものでしょう。たぶん。
このプロパティを通してウインドウの中身をいじれるようになるのだと想像します。
strongは強い参照。謎ですが、循環参照がある場合は弱い参照を使うそうです。nonatomicはスレッドセーフではない。

AppDelegate.m

#import "AppDelegate.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    return YES;
}
- (void)applicationWillResignActive:(UIApplication *)application
{
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
}
- (void)applicationDidBecomeActive:(UIApplication *)application
{
}
- (void)applicationWillTerminate:(UIApplication *)application
{
}
@end
AppDelegateのメソッド定義ですが、ほとんど空です。ここにいろいろとアプリ特有の動きを記述して行くのでしょう。

MainStoryboard.storyboard

ビューを取りまとめてアプリ全体の遷移を管理しています。
初期状態ではビューコントローラがひとつだけ置いてあって、中身はViewControllerクラスに定義する感じでしょう。

最初に呼び出されるストーリーボードはtest-info.plistの「Main storyboard file base name」に書かれています。変えることもできるようです。

ViewController.h

#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
UIViewControllerを継承しています。
ボタンなどを配置したら、この中にプロパティを置いてボタンと結びつける感じです。

ViewController.m

#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
  [super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
}
@end
ビューコントローラの中身です。
@interface ViewController ()
@end
この2行はなんでしょう?わかりません。わかったら追記します。
- (void)viewDidLoad
{
  [super viewDidLoad];
}
ビューが読み込まれたときに呼ばれるメソッドです。初期化処理などをすると思います。
superはスーパークラスの同メソッドを呼ぶのでしょう。
- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
}
ビューのメモリが足りなくなったときに呼ばれるのでしょうか?おそらく。
前ページ iOSアプリ開発メモ TOP 次ページ
このエントリーをはてなブックマークに追加 そっか0