投稿

Unable to verify icon dimensions

問題 iPhone/iPod Touch: Info.plist: Unable to verify icon dimensions, no icon found.  Your MinimumOSVersion is below 3.2, so you must define CFBundleIconFile or provide a default Icon.png that is 57x57. (-19013) 解決法 アイコンが見つからないそう。 icon.pngをIcon.pngに変更するとエラーは出なくなった。

ランダム処理

初期化 srand(time(NULL)); 実行 rand() % (ほしい値の範囲) rand()は整数の範囲の中でランダムな値を返す

保存について

アプリを立ち上げた時に、前回使用した時のデータを使いたい場合があります。 やり方はいろいろあるようですが、シリアライズというものを使ってみます。 これは、インスタンスをまるごと冷凍保存しておいて、次に使うときに解凍するようなイメージの技術です。 必要なことは ・保存したいインスタンスをシリアライズに対応させる ・シリアライズする処理 ・復元する処理 の3つです。 web上によい記事がいくつかあります。具体的なことはこちらに。 http://nagano.monalisa-au.org/?p=64 http://d.hatena.ne.jp/KishikawaKatsumi/20081014/1223986859 注意点は ・復元したときに参照カウンタを+1しないので、retainしておく。 ・復元時にはinitWithCoderが実行される。initは実行されない。initWithCoder内で[super init]はいる。 ・インスタンス変数にはシリアライズに対応していないものがある場合は、それをシリアライズ出来るようにしておく。 例えば、 A{ B C } B{ D E } の場合、 Aをシリアライズに対応させるには、BとCもシリアライズに対応しないといけない。 このとき、DとEをシリアライズに対応しないと〜 と芋づる式にどんどんシリアライズのコードを書くことになります。 エンコード時にシリアライズされるインスタンスの参照カウンタはどうなる?というのを疑問に思ったのでやってみました。参照カウンタは+1されます。シリアライズするとき必要になるだけなので参照カウンタは変わらないと予想したのですが、カウントされるようです。エンコードオブジェクトが消される時に-1されるのでしょう。

[self performSelector: @selector (methodAfterDelay) withObject: nil afterDelay: 0.0];

イベントサイクルの中でsetNeedsDisplayを読んで、さらに [self performSelector: @selector (methodAfterDelay) withObject: nil afterDelay: 0.0]; とすると、drawRectとmethodAfterDelayの実行の順序はどうなるか? どうもdrawRectが呼ばれてからmethodAfterDelayが呼ばれることも drawRectが呼ばれずにmethodAfterDelayが呼ばれることも両方あるようである。 最後の0.0を0.1にするとdrawRectが呼ばれてからmethodAfterDelayが呼ばれる(もしくは可能性が高い)。

1つのプロジェクトから2つのバージョンを作るときのまとめ

有料版の他に無料版を作るときは、それぞれのXcodeプロジェクトを作るのではなく、1つのプロジェクトから2バージョン作れたほうが、管理が楽! なのでそのやり方を簡単にまとめておく(内容の正確さは保証しないので注意。徐々に訂正していくノリです)。 ・前知識 「あるアプリとあるアプリが別のアプリである」とみなす条件は「バンドル名」と「バンドルidentifier」が別であることらしい。 バンドル名:作成されるアプリは実際はファイルが階層構造になっている。その一番親のフォルダの名前。 バンドルidentifier:com.apple.enjoybikeのような他とかぶらないようにアプリに付けられる識別子 ・ターゲット情報の複製 ターゲット情報とは実行ファイル(ユーザーのiPhoneにダウンロードされるファイル)をどう作成するかの情報。これを有料版と無料版でわけておく。 複製のやり方はXcodeでプロジェクトを開いて、左の「ターゲット」の項目にあるものを右クリックから複製し、新たな名前(◯◯Liteなど)をつける ・プロダクト名の指定 プロダクト名とはアプリの名前。 新たに作成したターゲットで右クリックして、「情報を見る」を選択。「ビルド」というタブをクリックし、出てきたリストの中の「プロダクト」の欄。ここを変更する。注意、Product Nameがターゲット名と同じになる設定になっていて、変更する必要がない場合は変更しなくてもいい。 ・info.plist バンドルidentifierを指定するのがinfo.plistというものです。有料版と無料版で別のバンドルidentifierを指定してやる必要があります。さきほどターゲットを複製したときにinfo.plistも新しいのが作成されし、Xcodeに追加されているのでそれを使用したい名前に変更。その中のバンドルidentifierも変更しておく。 その後、作成したターゲットの「情報を見る」を選択し、「ビルド」タブをクリックし、「info.plistファイル」の項目の名前も変更する。 ソースコードの中でバージョンによって走らせる部分を制御すると思います。 やり方をLITEバージョンの例でいうと、LITEバージョン用のターゲットの「情報を見る」より「プリプロセッサマクロ」の項目(探すの...

UI

今日、喫茶店でチュートリアルのサンプルを作ってきた。 そのとき感じたことは、このアプリはまだUIが未熟だということ。 商品化のレベルに達してない。 演算装置の使い方が下手だ。もっと、必要なところを厳選しないといけない。 最近iPod Touchの新しいのを買ったが、そのときにも同じことを感じた。 新しいのはCPUが速いが画面のピクセル数が多いので、同じ処理をしても時間がかかるかもしれない。

メモリが足りないとき

アプリが落ちるという指摘を受けてinstrumentsで原因を調べていたら、どうやらメモリが足りないときに落ちるようである。 原因は **** = [UIImage imageNamed:@"****"]; というソースコードだった。 実際に落ちるところは [**** drawAtPoint:〜] とその画像をViewに描くところ。 initで始まるメソッドでないのでautoreleaseがされるのだが、メモリが足りなくなるまではなぜか画像は表示されて、足りなくなると描写メソッドで落ちる。 原因となる箇所はわかったが、なぜメモリが足りなくなるまでなぜ表示されるかは謎。 ちなみに対応は self.**** としてretainカウンタを+1しておく対応をした。