Drowsy Dog's Diary

any note, any thought

2013年3月12日
by kazoo
0 comments

NSLayoutConstraint

下記のエラーについて。

*** Terminating app due to uncaught exception ‘NSInvalidUnarchiveOperationException’, reason: ‘Could not instantiate class named NSLayoutConstraint’

iOS6から導入された NSLayoutConstraint クラスは、 UIObject どうしの関連を Constraint(制約、制限)ベースで調整し、4インチでも3.5インチでもうまいことレイアウトを行ってくれる(らしい)機構ですが、うっかりこれを有効にしたまま シミュレータを 5.1 とかに戻すと当然そんなクラス知らんわ、となるわけですね。
しかし、 Deployment Target を 4.3 とかにしててもデフォルト有効なのですね。。さすが林檎さん。

これを無効にするにはそれぞれの xib にて Use Autolayout のチェックを外してやれば OK。
NSAutolayout

しかし、このチェックを安心して ON にできるのっていつ頃でしょうね。。
iOS4.3 以前のユーザはすでに5%未満という数字を何かで見ましたが、ほとんどのユーザが OS6 になるだろうという状態は、4→5の頃に比べるとかなり高い壁のような気も。

2013年3月6日
by kazoo
1 Comment

iOSシミュレータ上アプリの実ファイルパスとバンドルリソースの上書き

ちょっとやらかしたのでメモ。。

iOSシミュレータで扱うアプリケーションの実際のファイルパスは、

/Users/xxx/Library/Application Support/iPhone Simulator/6.1/Applications/XXXXXX-XXXX-XXXX-XXXX-XXXXXXX/hogehoge.app/

のようになり、バンドルリソースもこの下にあります。(OS X Lion, XCode 4.6, Simulator 6.1)
iOSバージョンが変われば当該のディレクトリも変わるけど、iPhone/iPad それぞれのシミュレータでは共用らしい。

で、このディレクトリ、シミュレータ上でアプリをアンインストールしたり、メニューから「コンテンツと設定をリセット」したときは消えるのだけど、アプリを上書きでシミュレータをスタートさせるときには同じディレクトリに上書きとなるので、たとえばバンドルリソースファイルが削除されていても、シミュレータ上には古いリソースが残っていたりします。フォルダリファレンスとして登録されたバンドルリソースのディレクトリ内容を手動で変更したときにありがち。

また、たとえば XCode プロジェクトのフォルダをまるっとコピーして、別の開発リソースとして作業をしていても、プロジェクト名(BundleID)が同じものは、シミュレータ上のバンドルリソースも同じディレクトリになります(シミュレータ上同じアプリなんだから当たり前ですが)。

以上は実機でも同じです。上書きのときに古いバンドルリソースは OR を取る形で残っている。

なので、XCode プロジェクトを成果物としてリリースする場合、固めたリリース物を再度解凍して別ディレクトリで最終テスト。。なんてやってるつもりが、XCode 上には存在しないリソースが実は手元のデバイスやシミュレータには残っていて、「おい動かねーぞ」「あほかこっちでは動くわ」なんてやり取りをするハメになったりします。というかなった。反省した。

最終テストはクリーンな環境でやりましょう。。という、ごく当たり前のお話でした。

 

あと、シミュレータアプリのディレクトリをうっかり手動で削除したりすると、

error: failed to attach to process ID 0

というエラーで上書きできなくなったりします。このときにも、素直にシミュレータ上のアプリを長押ししてアンインストールしましょう。