HelloWorldAppDelegate.h のソースコードを読んでみる
[ HelloWorldAppDelegate.h ] は、アプリ [ Hello, World! ] を起動・終了した時に動作するクラスの宣言をするヘッダーファイルです。
オリジナルのソースコードは次のような感じ。
#import <uikit uikit.h>
@class MyViewController;
@interface HelloWorldAppDelegate : NSObject <uiapplicationdelegate> {
IBOutlet UIWindow *window;
MyViewController *myViewController;
}
@property (nonatomic, retain) UIWindow *window;
@property (nonatomic, retain) MyViewController *myViewController;
@end
ここから、一行ずつ理解していきます。
1 行目 : フレームワークの読み込み
#import <uikit uikit.h>
iPhone SDK のキモ [ UIKit/UIKit.h ] というユーザーインターフェース用のフレームワークを読み込んでいる。 行頭に [ ## ] が付くのはプリプロセッサ命令と呼び、プロセスが始まる前に命令が動く。
2 行目 : 他の場所で定義されたクラスの名前を宣言
@class MyViewController;
[ MyViewController ] は独自に作ったクラスなので [ NSObject ] に含まれていない。
だから、特別にクラスを宣言しておく。
3 行目 : クラスの宣言
@interface HelloWorldAppDelegate : NSObject <uiapplicationdelegate> {
@interface
から @end
の間に書かれているのはクラスの宣言です。
@interface
の文法は次のような感じ。
iPhone OS の Objective-C を使ったフレームワークは、ほぼ全てこの NSObject と言うスーパークラスを親にしてるため、NSObject をスーパークラスとして宣言しておけば、NSObject 以下の全てのクラスが使える。
プロトコルに書かれている UIApplicationDelegate は、アプリの起動・終了時に行われる固有の処理を担当するクラスなんだそうです。
4-5 行目 : インスタンス変数の宣言
IBOutlet UIWindow *window;
上の一文は、UIWindow 型の window というインスタンス変数を宣言して [ アウトレット ] として使うという意味。
MyViewController *myViewController;
上の一文は、MyViewController 型の myViewController というインスタンス変数を宣言している。
文法は次のような感じ。
- IBOutlet
- アウトレット
- UIWindow
- クラスオブジェクト型 ( iPhone の Window の事 )
- *window
- インスタンス変数の名前 ( 型がクラスオブジェクト型の場合は、変数名の頭にアスタリスクを付ける )
7-8 行目 : アクセサメソッドの自動生成用プロパティの宣言
@property (nonatomic, retain) UIWindow *window;
上の一文は、window というインスタンス変数へのアクセス方法を定義している。
@property (nonatomic, retain) MyViewController *myViewController;
上の一文は、myViewController というインスタンス変数へのアクセス方法を定義している。
アクセサメソッドとは、インスタンス変数へのアクセスを制御するメソッドで、これを書いておかないとインスタンス変数の値が読み書きできない。
宣言部分に [ @property ] を、実装部分に [ @synthesize ] をセットで書いておくと、自動的にアクセサメソッドを生成してくれます。
9 行目 : クラス宣言の終了
@end
ここまでがクラス宣言。
長かった…。