投稿

2010の投稿を表示しています

保存について

アプリを立ち上げた時に、前回使用した時のデータを使いたい場合があります。
やり方はいろいろあるようですが、シリアライズというものを使ってみます。
これは、インスタンスをまるごと冷凍保存しておいて、次に使うときに解凍するようなイメージの技術です。

必要なことは
・保存したいインスタンスをシリアライズに対応させる
・シリアライズする処理
・復元する処理
の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バージョン用のターゲットの「情報を見る」より「プリプロセッサマクロ」の項目(探すのが少し大変)にLITEといれておくと、

UI

今日、喫茶店でチュートリアルのサンプルを作ってきた。
そのとき感じたことは、このアプリはまだUIが未熟だということ。
商品化のレベルに達してない。
演算装置の使い方が下手だ。もっと、必要なところを厳選しないといけない。

最近iPod Touchの新しいのを買ったが、そのときにも同じことを感じた。
新しいのはCPUが速いが画面のピクセル数が多いので、同じ処理をしても時間がかかるかもしれない。

メモリが足りないとき

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

Ready for Sale

Ready for Sale来ました。
メールで通達されますが、
The following app has been approved. The status has changed to Ready for Sale.
が結構うれしいです。

こちらで
LadderTouch
itms://itunes.apple.com/jp/app/laddertouch/id386737169?mt=8

command /usr/bin/codesign failed with exit code 1

command /usr/bin/codesign failed with exit code 1
キーチェインにDeveloperの鍵の証明書を入れるところは「ログイン」を選ぶこと!
「システム」はダメらしい。WWDRは「システム」もでOKだった。

追記(2011/12/14)
また同じエラーにはまってしまった。
今度はは古い証明書が残っていてそっちを参照していてエラーになっていたらしい。キーチェーンアクセスを何度も見ていたのに気づかなかった。デフォルトでは期限切れの証明書は表示しない設定になっているようだ。表示→期限切れも表示に設定すると表示されると思うのでそうしてあればもっと早く解決したかもしれない。

iTunes Connect Developer Guide

アプリが完成してから発売するまでの手順についての公式資料です。
日本語化されてます。

内容は
アプリケーションのアップロードに必要なものなど

はじめてのiPhone3プログラミング

日本語訳が悪い

iPhoneアプリのディレクトリ構成

NSString *path = [[NSBundle mainBundle] pathForResource:@"aaa" ofType:@"bbb"];
でccc.app直下。XcodeではResoucesにあたる。

NSArray *paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"aaa.bbb"];
でccc.appと同等のレベルのDocumentsの下のaaa.bbb

Documentsの下の方はシミュレータでも実機でも読み書き可。
ccc.app直下の方はシミュレータで読み書き可、実機では読み込みのみ可。

間違いがあるかもしれない。

MAXの教科書

とりあえずchapter4まで読んだところでおなかいっぱい。

MAXを使ってなにかを作ろうとは思わない。
それよりもMAX自体に興味がある。

MIDIが出来てから、それを使うソフトがいろいろ出たなかで、CubaseやLogicのような発展をするのが普通だと思うがMAXはそれ自体がアイデンティテイを持ってしまって独自の発展をしたように感じる。

作品は模倣が基本なのにMAXの場合は模倣に意味があまりないように感じる。

EXC_BAD_ACCESS

EXC_BAD_ACCESSというエラーが出て原因がわからなかった。
コンパイルは通るが実行時にエラーが出る。
ネットでいろいろ調べて、アクティブな実行可能ファイルを設定というものに変数を設定してみた。しかし、まだ出る。いろいろやっていて、その変数のなかの一つを外してみたら、エラーがでなくなった。結果的には良いが、原因わからず。

基礎UML

ラダーアプリの大きさがどんどん大きくなり、全体が把握出来なくなり、クラス設計図を書く必要が出てきた。そこで、UMLを勉強しようと思い、基礎UMLという本を読み、自分でも書いてみる。で、それを見ながら、アプリを動かすときにどういう処理をするか考える。

基準は「実装の量が少なくなるか」よりも「あとから見てわかりやすいか」を重視。だいたいまとまったので実装を始める。

インターフェイスビルダーのカラーパレット

インターフェイスビルダーのカラーパレットと、インスペクタのカラー部分との関係
インスペクタのカラー部分をクリックするとカラーパレットとが出てくるが、カラーパレットの操作がインスペクタの方に反映されるときと、されないときがある。つまり両者の間にコネクト状態と非コネクト状態と両方の状態があるので注意。それは外枠の濃さで判断出来る。濃いときはコネクト状態、白い時は非コネクト状態。コネクト状態の時にカラーパレットから色を選択してやると色指定が出来る。

供給された iPhone OS デバイスが接続されていません

10800円で開発者の会に入会する時に一度トラブルがあるらしい。
メールで問い合せると対応してくれる。

10800円を払ったので、iPodでテスト出来る手続きをしてみたる。
参考にしたのは
http://gihyo.jp/dev/serial/01/iphone/0009?page=1

感想
ややこしい。人に説明しろといわれても出来ない。
App IDというのがよくわからないが、とりあえず自分の名前にしておいた。

最後にiPodにアプリを転送するところでエラーが出た。
「供給された iPhone OS デバイスが接続されていません」
原因不明で、いろいろ調べてみたが、iPodの電源を入れ直すという方法でも解決しない。
XCodeとiPodのバージョンが違うのかなと思い、Xcodeを最新のにアップしようとしたら、ダウンロードページに黄色い注意マーク付きで以下の記述
If you have updated your device to iPhone OS 3.1.3 with iTunes, you must install iPhone SDK 3.1.3 in order to continue with your development.
自分の環境を調べるとiPodのバージョンは3.1.3で、XCodeのほうは3.1.2だったので、原因はこれだろうと思い、ダウンロードする。

ダウンロード後、実機テストが出来たが、Codesign error: no certificate was found in your keychain for the specified identidier "(null)"というエラーが出ている。原因わからず。

メモリ制御まとめ

体系的に学べるサイトはなかなかない。説明が難しいんだろう。
自分でもまとめて(というかただのメモ)みる。

retainCounter挙動

プラスされるとき
allocメソッドとinit(init〜)メソッドでのインスタンス生成で+1
Arrayに入れられると+1
[NSString stringWithFormat:〜]で+1ついでにAutorelease Poolに入る
copyは0からの+1

かわらない
@"〜"で生成されたNSStringインスタンスは静的

Clockの応用

赤松さんの本でClockというアプリを作ってから、自分でもいろいろ時計を作ってみようと思った。
まずは16進数時計、秒分時の概念をなくして、16進数で一日を区切る。一日の概念は地球の回転に基づくのでそこは変えない。人が勝手に設定したもののみを崩す。先日見てきたIAMASの卒業展風にいうと「既存の時間の概念を変えることによって時間のありかたを見直す」
16進数で4文字表記にすると、一単位あたり1.3秒くらいになる。この微妙なズレ加減が面白いと思った。カチカチ切り替わるのが普通の時計よりもちょっと遅い。
最初に苦労したのは、取得するデータが秒よりも細かいデータで取得する必要があること。秒で取得してから16進数4文字(16ビット)に変換すると誤差が出てくる。秒の小数点以下2桁くらいまで欲しい。NSTimeIntervalで今の時間を取得して、その小数点以下を取り出すことで対応する。

iPhoneプログラミングUIKit詳解リファレンス

iPhoneプログラミングUIKit詳解リファレンス
という本を買った。
なかなか読みやすい。深く考えながら読む本ではなく、ザーとブログを読むような感じで読める。

本の印象は内容だけで決まるのではなく、内容と自分のレベルの2つの要素によって決まる。その本に自分のレベルがあってなければ、いい印象にはならない。

コンパイルエラー覚え書き(Objective-C)

((赤のほう))

Variable length array declaration can not hava 'static' storage duration
メソッド内でstaticで配列を宣言するときに要素数が変数だと出る。

incompatible types in assignment
宣言に*を付け忘れ

variable-sized object may not be initialized
宣言に*を付け忘れ

expected ';' before '}' token
;忘れ

Expected expression before '〜' token
'〜'の前がおかしい

'〜' undeclared (first use in this function)
宣言忘れ、宣言の位置がおかしい

stay '3桁の数字' in program
日本語入力モードでなにか入力した

wrong type argument to unary minus
メソッドの引数がおかしいという意味
原因はほんとにメソッドの引数がおかしい場合と、すこし上のメソッドの}の閉じカッコ忘れでエラー部分が前のメソッドの一部と認識されている場合がある。

expected specifier-qualifier-list before '****'
2つの.hが互いに#importしあったときなどにおこる。
片方を
@class ****;
に変更するとエラーが出なくなることがよくある。
@class **** は.hのインポートではなく、ソースの中に「****」というクラスが出てきますが気にしないでください、と言うニュアンス。インポートはどこかでする必要があることがほとんどと思うが、.mの先頭でしてやればよい。
設計の見直しというのも解決方法のひとつ。

Lvalue required as left operand of assignment
代入可能じゃない(?)

Initializer element is not constant
int型の変数をstaticで宣言して同時に初期化しようとしたら出た。
宣言と初期化の文を分けたらエラーは出ない。
正直、エ…

UIWindow

UIViewは表示するために表示されている親Viewに追加する。
「インスタンス作成」と「見えるところに配置」がセットです。
しかし、UIWindowはインスタンスを作っただけで表示され、それを見えるようにする処理がどこにもないように思えて、これがずっと不思議だった、が今日解決した。
makeKeyAndVisibleメソッドでやってるようだ。KeyWindowというのが表示されるウインドウのことで、KeyWindowに設定されたUIWindowが表示権を獲得するようなシステムらしい。

基本

がつがつアプリを作ってきたが、UI部品の使用法など基本的なことをもっとやってからの方が効率がいいのでそっちに重みを置く。赤松本、木下本、公式資料などで勉強する。

全体の設計図

全体の設計図が難しい。
過去の実績もない新規のアイデアを作っている人ってどうやって判断しているんだろうか。
今のところ、みちしるべがMVCの考え方しかない(それしか知らない)のでMVCを基本にしてやっている。
UMLを勉強したらいいのかもしれない。UMLの知識よりもUMLの活かしかたの方。

疑問点等

メモリ制御(alloc init dealloc autorelease)に対して非常に悩む。本が何冊かあって、いろいろ読んでいるが、読んでも読んでも疑問点が出てくる。メモリレベルでの挙動まで解説してあるといいんだが。
あと、@propertyも壁だなぁ。アサイン、コピー、リテインの違いがなかなかピンとこない。これもメモリレベルの挙動が知りたい。
デリゲートというのが「なに」から「なに」に委託するのかがいまいち掴めなかったのだが、システムからデリゲートファイルに委託するという解釈のようだ。

ラダー描写

ラダー描写をどうすればいいかさっぱりわからない
まあ、あたりまえか

手当たり次第いろいろやってみることにしよう

つまずく

アイデアが浮かんでちょっとしたことをやろうとしても、
そのちょっとしたことに行き着くまでにいろなところでつまずく。

公式の資料を読もうとしても、いちいち説明が長いし、何か作ろうとしてもすぐつまずくし、ちょっと出口の見えない状態