sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

「iPhone/iPad アプリケーション開発の教科書」前編

プロの力を身につける iPhone/iPadアプリケーション開発の教科書

プロの力を身につける iPhone/iPadアプリケーション開発の教科書

さすがに入門書はもうお腹いっぱいなのですが、 少し変わった切り口っぽいので斜め読みしてみようと思います。

入門レベルの内容のところはすっ飛ばす予定。

序章

iOSアプリを始める為の心構えや学習方法、必要なもの等の解説

  • 対象読者は他のオブジェクト指向言語でのプログラミング経験者
  • iOSの方が学習し易いので、iOSとAndroidアプリで悩むならiOSがいい。androidはHelloWorldは簡単だが、複雑なアプリを組むのは難しい、iOSはHelloWorldへ辿り着くのが大変だが、複雑なアプリでも極端に難しくはならない(と書かれていますが、iOSの方が楽しいだけで、複雑なアプリの大変さはどっちも変わらないような気が)

1章 Objective-C入門

最初に文法の説明がずらっと並ぶ。いい感じ。

オーナーシップポリシー

  • -allocではじまるメソッドで生成したオブジェクトの所有権を持つ
  • 自身で生成していないオブジェクトに-retainを送信すると所有権を持てる
  • 所有しているオブジェクトが必要なくなった時は、-releaseを送信して所有権を破棄する
  • 所有していないオブジェクトに対して -releaseを送信してはいけない

2章 iOSアプリの画面開発の基礎を理解する

画面開発の基礎知識

最初にiOSアプリのUX,UIがどんな風に組み立てられているのかがざっと提示されている。 その後でInterfaceBuilderの簡単な使い方、そしてUIViewの派生クラス、UIViewControllerの 解説と移って行きます。

イベント駆動

ライフサイクルイベント(システム由来で発生)とユーザーアクションイベント(ユーザーの操作由来で発生)の解説。基本的には公式ドキュメントに書いてありますが、P123-128のライフサイクルイベントの図は、全体をざっと把握するのに役立つと思います。

イベント受け取るUIResponderの解説と、タッチ以外のイベントを最初に受け取るFirstResponderの設定のやり方の解説。FirstResponderってイベントを受け取るものとしか認識していなかったけど、ここの解説で腑に落ちました。

テーブルビューとコレクションビューを使ったアプリの作り方

この辺りはうんざりするほどの基本なので斜めにしか読んでいないけれど、サンプルもちゃんとしてるし、それぞれの特徴も解説されています。

その後、UINavigationControllerによる画面遷移をさらっと解説

3章 データを活用したアプリの作り方

データの保存のお話。iOSのざっくりとしたメモリの領域の説明と、データの種類によってどの領域に保存するのが良いかの解説。

永続化

アプリから使用可能な4種類の永続化方法と、保存先となるディレクトリの解説。ガイドラインでの指定の話。

CoreData

とりあえず、リレーショナルデータベースとオブジェクトデータベースの違い、O/Rマッパーの必要性の解説。

そしてCoreData。納期の都合とSQLiteを直接扱う方が簡単だったため、CoreData関連はあまり理解していなかったのだけれど、この本の説明はわかりやすかったです。

ということで、本腰入れて読んでみました。

主なクラス
  • NSManagedObject - 永続化されるオブジェクトの基底クラス
  • NSManagedObjectCOntext - データの検索、挿入更新削除やUndo/Redoを行う
  • NSFetchRequest - データの検索条件を管理
  • NSFetchedResultsController - NSManagedObjectを監視する。NSManagedObjectが挿入・変更・削除された時に、NSFetchedResultsControllerDelegateに通知する
  • NSEntitiyDescription - エンティティの定義を管理する
  • NSManagedObjectMode - エンティティ同士の関連を管理
  • NSPersistentStore - データベースの情報を管理
  • NSPersistentStoreCoordinator - NSPersistentStoreを管理。複数のデータベースを管理可能

特に重要なのがNSManagedObject, NSManagedObjectContext, NSFetchRequest,NSEntityDescriptionの4つ

エンティティ
  • 永続化対象のデータのことをエンティティと呼ぶ。データは全てエンティティを作成する必要がある
  • エンティティの定義はモデルエディタによって行う。
  • エンティティの情報の取得には、NSEntityDescriptionオブジェクトを使用する
CoreDataを使う為の準備
// モデル生成
NSURL* modelURL = [[NSBundle mainBundle] URLForResource:@"Boo" withExtension:@"Foo"];
NSManagedObjectModel* model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// SQLiteの永続化ストアをコーディネーターに設定
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSURL* storeURL = [[paths objectAtIndex:0] URLByAppendingPathComponent:@"Hoge.sqlite"];
NSPersistentStoreCoordinator* coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:nil];
// コンテキスト生成
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
  • NSManagedObjectModelオブジェクトの生成
  • NSPersistentStoreCoordinatorオブジェクトの生成
  • NSManagedObjectContextオブジェクトの生成
新規データ作成
NSManagedObject* manObj = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:context];
NSError* error = nil;
if(![context save:&error]){
    // エラー処理
}
データの検索と編集

検索にはNSFetchRequestオブジェクトを使う。NSPredicateで条件、NSSortDescriptorでソートを指定する。

// リクエストオブジェクト生成
NSFetchRequest* request = [[NSFetchRequest alloc] init];
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:context];
[request setEntity:entity];
// 条件指定
NSPredicate* pred = [NSPredicate predicateWithFormat:@"条件"];
[request setPredicate:pred];
// ソート指定
NSSortDescriptor* desc1 = [NSSortDescriptor sortDescriptorWithKey:@"1st_key" ascending:YES];
NSSortDescriptor* desc2 = [NSSortDescriptor sortDescriptorWithKey:@"2nd_key" ascending:NO];
[request setSortDescriptors:@[desc1,desc2]];
// 検索
NSArray* results = [context executeFetchRequest:request error:nil];
// 編集
NSManagedObject* resObj = [results objectAtIndex:0];
[resObj setValue:@"Boo" forKey:@"name"];
if(![context save:&error]){
    // エラー処理
}
データ削除
[context deleteObject:[results objectAtIndex:2]]; // 3番目のオブジェクトを削除
if(![context save:&error]){
    // エラー処理
}

以降、本の中ではサンプルアプリの解説が続きますが、なんとなく理解できたのでこれは眺めるだけにしました。

StoreにSQLiteを使うだけなら、CoreDataなんてまどろっこしいだけかも?モデルエディタでERっぽいのを書くだけで色々なものが自動生成されるのは便利そうですが、SQLiteでもサポートツールを使えば似たようなこともできますし、また余裕のある時に公式ドキュメントで研究してみることにします。

iCloud

3章の最後はiCloudに関する解説。過不足ない感じ


んー、一冊目がこの本だったら、始めた頃の苦労がかなり軽減されたろうにと思う本。 序章にも書かれていますが、初学者にはきついけど。経験者なら楽に進んで行けそう。

ちょっと長くなったので、一旦切ります

次回へ続く