技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Objective-C の開発環境など

開発にあたって、自分が使ってるものを列挙する。

設計

Objective-C のメッセージングは、普通のクラス図では表現しがたい。
なので、設計にはマインドマップを使ってる。
http://www.xmind.net/

開発

といっても開発環境はAppleさん指定なので何も言うまい。
テスト環境だけ列挙。
http://code.google.com/p/google-toolbox-for-mac/wiki/iPhoneUnitTesting
http://github.com/katsuyoshi/iunittest/tree/master

その他

カバレッジソフト
http://code.google.com/p/coverstory/

ゲーム環境的には Cocos2D とかよさ気だが、まだ手を出してない。

シミュレータのバージョン互換バグ

2.2.1 でソフトをアップせねばならず、かつ OS3.0 でも動くようにしろとの Apple さんのお達しに従い、両対応しようとしたが、ハマった。
AVFoundation とか、ライブラリを使ってると、Simulator 2.2.1 ビルドのバイナリが、OS 3.0 Simulator で、「そんなライブラリねえよ!」と怒られる。
上位互換しないのか!?と焦ってたら、実機(Device 2.2.1 Build)でサックリ動きやがった。
…しっかりしてくれ Apple さん。

昔から MS は色んな人に文句言われてるけど、個人的には Apple より開発者に対するサポートはいいよね。
OSS なら Linux がいいんだろうか?
Apple の「開発者を食い物にする」姿勢はやっぱヤダ。

http://jp.techcrunch.com/archives/20090325apples-iphone-app-refund-policies-could-bankrupt-developers/

iPhoneOS 3.0 SDK のUIScrollView 挙動の変化

iPhoneOS2.2.1 までは touchesBegin: → touchesMoved: → touchesEnded: くらいまで、子クラスで取れる。
しかも何故か、touchesEnded: が2回起きる。
iPhoneOS 3.0 SDK でコンパイルすると、touchesEnded: が1回呼ばれるだけ。

直ったといえば聞こえはいいが、まだ 2.2.1 向けビルドしないと審査通らない。
どうするか悩んだ挙句、以下の選択肢があると。

UIDevice 使う

普通の手段で OS のバージョン拾う。

  NSString* version = [[UIDevice currentDevice] systemVersion];

この方法だと、シミュレータバージョンを変えたときにどうにかなるんだが、
ビルドの状態まで把握できない。
加えて文字列だから、「バージョン XX 以上」とかやるのがだるい*1

__IPHONE_OS_VERSION_MIN_REQUIRED の値を参照

こんなマクロがあって、iPhoneOS 3.0 だと、「30000」に化ける。
だから、この値以上なら、、、、と指定する。
ただし、アンドキュメントなので、自己責任で。

*1:compare とか使えばいいんだろうけど

よく出るエラーと原因

BAD_ACCESS :release か autorelease で既に開放済みのインスタンスにアクセス
BAD_INSTRUCTION :Javaで言う ArrayIndexOutOfException 配列のインデックスが間違ってる

この辺かなり地獄、、、、。
やっぱネイティブ言語はエラーが分かりづらいからヤダ。*1

*1:スタックトレースが全部汗とか勘弁して欲しい

iPhone から AppStore の検索URLにリンクする

通常、 Skype とかのダウンロードサイトを開くときは、以下の手順を踏む。

  1. PC で iTunes 起動して、商品を検索(ここでは skype)
  2. 商品名を右クリックして、「iTunes store URL をコピー」を選択。
  3. http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=304878510&mt=8」こんな感じでコピーされる。
  4. iTunes」を「phobos」に置き換える。(置き換えない場合、URLを開くと、一旦 Safari を起動したあとで、AppStore が起動する)

で、最後に次のコードを書く。

NSString* urlString = @"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=304878510&mt=8";
NSURL *skypeURL= [NSURL URLWithString:urlString];
[[UIApplication sharedApplication] openURL:skypeURL]; 

検索したいときのURLとはなんぞやと思ったら、iPhoneDevelopperJapanでGClue社の佐々木様が書いてくださってた。

 NSURL *skypeURL = [NSURL URLWithString:@"http://phobos.apple.com/WebObjects/MZSearch.woa/wa/search?entity=software&media=software&submit=seeAllLockups&term=skype"];
   [[UIApplication sharedApplication] openURL:skypeURL]; 

AppStore を検索モードで起動してくれると。
公式ドキュメントでは上半分の Tips しかなかったぜよ。
http://developer.apple.com/iphone/library/qa/qa2008/qa1629.html

iPhone で画面イメージを取得する

前回と似たネタ。

#import <QuartzCore/QuartzCore.h>
- (UIImage*) buildImageFrom: (UIView*)view {
    UIGraphicsBeginImageContext(view .bounds.size);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return viewImage;
}

このとき、取得できる UIImage は autorelease 済みなので、 release すると死ねる。
今回は公式公開の API なので、胸を張って Apple に出せるな。
import はあってもなくてもよい*1

*1:無い場合は、renderInContext で warning が出る