第4回 iPhoneアプリ開発勉強会 Objective-C 基礎講座 -クラス- 鷲見政明
はじめに オブジェクト指向の考え方 Objective-C クラスの作成 アクセサの実装 イニシャライザの実装
オブジェクト指向の考え方 例.ファイルにデータを書き込むプログラム 1.書き込むデータをDBから取得 2.取得したデータをファイルに書き込む 書き込み依頼 データ取得依頼 C B DB FILE A 書き込み データ取得 メッセージ メッセージ 自律分散協調動作
クラス (class) と メソッド (method) Bにはどんな機能が必要か? C B 書き込み依頼 データ取得依頼 A -データの取得を依頼する +ファイルに書き込む B クラス メソッド
インスタンス変数 (instance variable)とアクセサ (accessor) 書き込み依頼 データ取得依頼 A ファイル名指定 B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 -データの取得を依頼する +ファイルに書き込む メソッド +ファイル名を設定する +上書きするか否かを設定する アクセサ
コンストラクタ (構築子:constructor) 詳細な書き込み依頼をしない場合のBのデフォルトの動作を設定したい C B 書き込み依頼 データ取得依頼 A B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する コンストラクタ メソッド アクセサ
デストラクタ (消去子: destructor) Bの終了時(※)の動作を設定したい C B 書き込み依頼 データ取得依頼 A B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する コンストラクタ メソッド アクセサ +終了時の動作 デストラクタ
オーバーロード (overload) 場合によっては書き込み依頼のときにファイル名を教えたい クラス インスタンス変数 コンストラクタ C B 書き込み依頼 データ取得依頼 A ファイル名指定 B クラス -書き込むファイル名 -上書きするか?(同名ファイル有時) インスタンス変数 +初期化 -データの取得を依頼する +ファイルに書き込む +ファイル名を設定する +上書きするか否かを設定する +終了時の動作 コンストラクタ オーバーロード メソッド +ファイルに書き込む(ファイル名指定) アクセサ デストラクタ
インスタンス化 (instantiation) クラスを基に実際の値としてデータを生成 0.001 -1.212 1.321 0.205 -1.314 0.987 0.231 9.231 5.232 -0.981 1.001 -3.212 1.321 5.687 0.321 1.051 2.914 1.324 -0.039 0.021 0.910 -1.039 1.021 0.905 class インスタンス化 解放 (設計図) instance コンストラクタが走る デストラクタが走る
インスタンス化 (instantiation) C言語の構造体の使い方によく似ている /* header files */ #include <stdio.h> #include <string.h> #include <stdlib.h> /* structures */ typedef struct flab_tag { int no; char name[256]; char tel[256]; } flab; /* main */ int main(void) { flab member; member.no = 6116; strncpy(member.name, "Masaaki Sumi", 255); strncpy(member.tel, "090-xxxx-xxxxi", 255); printf("no: %d\nname: %s\ntel:%s\n", member.no, member.name, member.tel); return EXIT_SUCCESS; } クラスの定義に相当 インスタンス化に相当
これまでのまとめ 以下の用語を理解しておきましょう クラス (class) メソッド (method) インスタンス変数 (instance variable) アクセサ (accessor) コンストラクタ (constructor) デストラクタ (destructor) オーバーロード (overload) インスタンス化 (instantiation) インスタンス (instance)
継承 (inheritance) 異なるフォーマットのファイルに書き込む 実装に手間がかかる B1 C1 A B2 C2 BN CN 請求ファイル 書き込み依頼 B1 C1 請求データ 取得依頼 A 収入ファイル 書き込み依頼 B2 収入データ 取得依頼 C2 ・・・・ 支出ファイル 書き込み依頼 BN 支出データ 取得依頼 CN 実装に手間がかかる
継承 (inheritance) オーバーライド(override) ファイル #書き込むファイル名 #上書きするか?(同名ファイル有時) +初期化 #データの取得を依頼する +ファイルに書き込む +ファイルに書き込む(ファイル名指定) +ファイル名を取得する +上書きするか否かを取得する +ファイルをクローズする 請求ファイル 収入ファイル +ファイルに書き込む +ファイルに書き込む(ファイル名指定) +ファイルに書き込む +ファイルに書き込む(ファイル名指定) オーバーライド(override)
継承 (inheritance) 般化 スーパークラス (親クラス:superclass) サブクラス (子クラス:subclass) Objective-Cは多重継承可能 特化
クラスの作成 Objective-Cのクラス 一般的な実装 インターフェース部 実装部 1つのクラスで2つのファイル クラス名.h (インターフェース部) クラス名.m (実装部 )
クラスの作成 インターフェース部 実装部 @interface クラス名 : スーパークラス名 { インスタンス変数の宣言; ・・・ } インスタンス変数の宣言; ・・・ } メソッドの宣言; ・・・ @end 実装部 @implementation クラス名 メソッドの定義 ・・・ @end
クラスの実装例 インターフェース部 実装部 @interface HelloWorld : NSObject - (void) hello; @end 実装部 @implementation HelloWorld - (void) hello { NSLog(@"Hello world!"); } @end
NSObjectクラス NSObject subclass1 subclass2 ・・・ subclassN ルートクラス (root class) 基本的にすべてのクラスはNSObjectを継承しなければならない!
クラスのインスタンス化 基本 実用的なインスタンス化 イニシャライザ (initializer) [クラス名 alloc] [[クラス名 alloc] init] イニシャライザ (initializer)
HelloWorld /* header files */ #import <Foundation/Foundation.h> /** class */ /* インターフェース部 */ @interface HelloWorld : NSObject - (void) hello; @end /* 実装部 */ @implementation HelloWorld - (void) hello { NSLog(@"Hello world!"); } /* main */ int main(void){ /* インスタンス化 */ HelloWorld *h = [[HelloWorld alloc] init]; /* helloメソッドの呼び出し */ [h hello]; /* インスタンスの解放 */ [h release];
アクセサの実装 ゲッターの実装 セッターの実装 インスタンス変数と同じ名前のメソッドを定義 以下の名前のメソッドを定義 ・インスタンス変数名の前に”set”をつける ・setの次の文字を大文字にする
アクセサの実装例 インターフェース部 実装部 @interface FileAccess : NSObject { /* インスタンス変数 */ NSString *fileName; // ファイル名 } - (NSString *)fileName; // getter [ファイル名] (void)setFileName:(NSString *)value; // setter [ファイル名] @end 実装部 @implementation FileAccess /** * getter [ファイル名] */ - (NSString *)fileName { return fileName; } * setter [ファイル名] - (void)setFileName:(NSString *)value; fileName = value; @end
イニシャライザ (initializer) Objective-Cはコンストラクタが存在しない インスタンス変数の初期化はどうするか? 初期化用のメソッドを作成 = イニシャライザ NSObjectクラスのイニシャライザ: initメソッド そこで initメソッドをオーバーライドして初期化処理を記述
イニシャライザの実装例 インターフェース部 実装部 @interface FileAccess : NSObject { /* インスタンス変数 */ NSString *fileName; // ファイル名 } - (id)init; // initializer @end 実装部 @implementation FileAccess /** * initializer */ - (id)init { self = [super init]; // スーパークラスのイニシャライザを呼ぶ if ( self != nil ) { fileName = @"./JoeCool.txt"; } return self; @end
おわりに 本日の内容 Next Week オブジェクト指向 Objective-Cによるクラスの実装(基礎) 継承の実装 インスタンス変数のスコープ