photo3
今日もコード書いてる??

先日リリースした拙作『ういろう』を取り上げて頂き恐縮です。

iをありがとう

AppLibrary

あぷまがどっとねっと

Appliv

どれも素晴らしいレビュー記事で、とても励まされます!!

で、現在さっそくiOS7に正式対応中なのですが…ほとんどUIKitとかARCとか使っていなくてC++で書いてる拙ソフトでもやはりいくつかiOS7対応の罠にハマっていたので、簡単にまとめておきたいと思います。


ステータスバーを非表示にする
 
Xcode5 + iOS7 SDKでビルドすると、これまで表示されていなかったステータスバーが表示されてします。これは、info.plistで以下のように「View controller-based status bar appearance」を追加すれば消せます。
 
photo1


NSInteger/NSUIntegerの値が64bit値になった

typedef long NSInteger;

NSIntegerはもともとこんな感じに定義されてて、これまではlongとintが同じ「32bit」でした。ですが、arm64ではlongが64bitになっています。ですのでビルド時に「longからintに変換されてるよー」と警告されます。ゲームのスコア計算くらいなら問題ないかもですが、これがUITouch:hashだと問題になってきます。
うっかり自分のコードでハッシュ値をint型の変数に保存していると、arm64ではハッシュ値がlong→int変換され、識別に必要な情報が失われてしまいます。32桁のシリアル番号の上16桁が無くなるみたいなもんです。これではタッチの判定でハッシュ値が同じかどうかの比較ができなくなるので直しました(汗)

NSIntegerの配列からint型の配列へ直接memcpyしてるのもヤバいよね??

NSInteger hoge[4];
int fuga[4];
memcpy(fuga, hoge, sizeof(hoge));
// ↑arm64ではhogeは32バイト、fugaは16バイトになる

しかもこれ、ビルド時に警告が出ないという…orz

あとは、
 
NSInteger hoge = 10;

NSLog(@"%d", hoge);

これもarm64だと警告が出るので
 
NSInteger hoge = 10;

NSLog(@"%ld", (long)hoge);

しばらくはこう逃げたほうがいいのかなぁ…


arm64対応とiOS5対応…どっち取る??両方!!

追記:AppStoreからダウンロードした32/64bit同梱アプリがiOS6では動作しないとの報告があるので、しばらくはこの方法は使わないのがよさそうです

Architecturesにarm64を含めると、「ビルド対象をiOS7以降にするよ??」というダイアログが表示され、iOS Deployment TargetがiOS7に変更されます。「いやいや、アプリはiOS5でも動くようにしたいんだけど…」と思って色々試行錯誤した結果、以下のように設定したらうまくビルドできましたー。

photo2

これ、オープンソースなライブラリとか、自作ライブラリとかにも適用してビルドする必要があると思う(自分がそうした)


iOS7は色々と大きく変わって戸惑ってますが、「変化に対応していくのも自分を鍛えるいい機会」と思って楽しんでます。


ではまた次回!!