MobileMe + SubversionでXCodeプロジェクトのバックアップとリビジョン管理

iPhone開発者ならほとんどがアドレス帳同期などのために使っているだろうmobileme。せっかくiDiskという10GBのストレージがついてくるのだから利用しない手はない。まずは"システム環境設定" - "MobileMe" - "iDisk"タブからiDiskSyncを開始する。
次にターミナルから

mkdir -p /Volumes/iDisk/Repository/ProjectName
svnadmin create /Volumes/iDisk/Repository/ProjectName --fs-type fsfs
mkdir -p tmp/{trunk,branches,tags}
svn import tmp/ file:///Volumes/iDisk/Repository/ProjectName -m "Initial import"

を実行する。iDiskSyncを使わずに/Volumes/[MobileMeユーザー名]以下にリポジトリを作ってしまうとimport時に排他的ロックが取得できないエラーで失敗してしまうので注意。
ここまできたら次にXCodeを立ちあげ、"XCode" - "環境設定"のSCMでリポジトリを追加してSCMシステムはSubversionを、URLは先ほどインポートした"file:///Volumes/iDisk/Repository/ProjectName"を入力すると認証完了。
次は"SCM" - "リポジトリ"からtrunkを選択した状態で"読み込む"を押しプロジェクトフォルダを読みこませる。もしbuildフォルダがデフォルトのままプロジェクトフォルダ下にある場合は先にそれを削除しておく。
これでtrunkを先ほど読みこませた場所とは違う場所にチェックアウトし、プロジェクトの "情報" - "一般"タブ でビルドプロダクトの保存位置をプロジェクトフォルダ外に置き、SCMリポジトリを設定すれば全ての設定は完了だ。
もしここでコミット時にエラーが出るようであれば、まずはXCodeから読み込ませたプロジェクトにビルドが残ってなかったか、あるいは以前に~/.subversion/configをいじって妙な設定にしていなかったかを確認すればいい。


iDiskとTimeMachineと二種のバックアップになり安心して作業ができるようになった。

UITableViewを作る

TableはiPhoneらしいリストを作れるため重宝するが、サンプルの数やメソッドの数を見るとくじけたくなる位複雑だ。
テーブルに慣れるため、最低限のテーブルを作る方法をまとめた。


まずUITableViewを生成する際、styleはUITableViewStylePlainとでもおいておく。表示される前にdelegateとdatasourceオブジェクトを指定する。
単に羅列表示する事だけが目的のテーブルが作りたい場合、実はdelegateは何も実装しなくていい。UITableViewDelegate Protocolのリファレンスを見るとわかるが、描画のためや選択時のふるまいに関わるメソッドなのでほとんどがオプショナルなメソッドである。


datasourceには二つだけ実装しなければならないメソッドがある。
一つは-tableView:numerOfRowsInSection:で、セクション毎のセルの数を返す。セクション分けが無い場合も0番目のセクションがある扱いとなる。
次が-tableView:cellForRowAtIndexPath:で指定された場所のセルを返す。


たいていは-tableView:cellForRowAtIndexPath:内でUITableViewCellを生成するが、UITableViewはメモリ消費を抑えるためにセルにはidを振り、セルをすぐにはallocせず、必要なセルのidでdequeueReusableCellWithIdentifier:に問いあわせて再利用可能なセルがあればそれを使うようにする。羅列表示だけならばここでセルのselectionStyleをUITableViewCellSelectionStyleNoneにしておくとタッチされても選択された状態にならないので楽である。

UIViewControllerのloadView

Implement loadView to create a view hierarchy programmatically, without using a nib.

とある通りIB使って細かい配置だけしておいてビューの階層はコード内に書くこともできる。だが、その際親クラスのloadViewを呼んでおかないとシミュレータではコンパイル時エラーも出なければ実行時エラーも出ず*1、まっしろな画面が表示されてしまう。
そのViewControllerのviewが0x0を指しているのが原因なのだが、いったいなぜエラーを出さないのか気になる。

*1:viewに何かしようとすると一応フリーズはする。

iPhoneSimulatorのみや実機のみでコンパイルする

iPhoneSimulatorだけや、実機だけで実行するコードを書く

#import <TargetConditionals.h>

#if TARGET_OS_IPHONE
    実機のみ *ではない*
#endif

#if TARGET_IPHONE_SIMULATOR
    シミュレーターのみ
#endif

#if !TARGET_IPHONE_SIMULATOR
    実機のみ
#endif

iPhoneSimulatorもiPhoneOSのうちらしい。

TwentyFiveを少し宣伝

自分も多少関わったiPhoneアプリが結構前に公開された。ちょっと手空きの時に英語の感覚を鍛えるためにどうぞ。
http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=297326138 (iTunesリンク)
http://twentyfivegame.com/ja/
このTwentyFiveというゲーム、実験的にいろんな展開をしていてWeb上でもプレイ可能。ランキングがなんだかすごい状態なので自信のある方は上位を目指してほしい。

iPhoneのDistributionビルド

まだガイドに載っていない、やりがちだがわかりづらい落とし穴。
通常AdHocでテストしてからAppStoreへアップロードするが、その際ほとんどの部分が同じだからといってAdHoc用のものをコピーしてビルド構成を作ってはいけない。
ガイドに載っている通りにしてもCodeSign failedではじかれてしまう。


原因はAdhoc用ビルドの際に作るplistファイルのget-task-allow。ビルド構成の設定がよくわからないのならばこれをtrueにしてやるといい。