ファイルに書き込む

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