Entries tagged “iPhone”

iPhone(JavaScript)でジェスチャ中にScrollを禁止

written by shn, on Aug 9, 2010 7:24:00 PM.

iPhone OS3系だと、touchmove中にスクロールしちゃって困ってた。(iOS4だと閾値が違うのかまぁ普通に動く)

phonegap / Preventing-Scrolling-on-iPhone-Phonegap-Applications

<script type="text/javascript">
touchMove = function(event) {
    // Prevent scrolling on this element
    event.preventDefault();
}
</script>
<body>
    <div id="container" ontouchmove="touchMove(event);">content goes here</div>
</body>

iPhone開発で最初に躓きがちな事

written by shn, on Mar 25, 2010 8:01:00 PM.

思いついたら随時更新していきます。 これも追加しろ!とか、間違ってるぞ!とかあったらコメントください。

ObjC周り

参照カウンタ

参照カウンタについて、呼び出し側が責任を持ってreleaseする必要があるのはinit系copy系を呼んだ時のみ。 これ以外は、呼び出され側(なんていうんだ?)が参照カウンタを持っている(か、例えばautoreleaseしてある)

リリースする前にBuild And Analyze

リリースする前に必ずBuild And Analyze(Shift+Cmd+A)をしよう。メモリリークやらなにやらを指摘してくれる。

NSNull vs nil

[NSDictionary dictionaryWithObejctsAndKeys]ではセンチネルとしてnilを使うが、nilを値として設定したい時もある。 その場合は代わりに印として[NSNull null]を使う。 nilの場合はNull Object Pattern的に、全てのセレクタ呼びだしは無視されるが、NSNullに何か呼びだすと例外が出るので注意。

STLが使いたい!!

hogehoge.mmとかにすればObjective-C++としてコンパイルしてくれるので、stlも使えるよ。

Interface Builder周り

File's Ownerを設定する

自作ViewControllerのxibを作って「あれれーロードされないぞ」って事になったら、File's OwnerがNSObjectのままになっていないかチェック

Subviewのpropertyはassignにする

subviewはviewが参照カウンタをもっているのでretainにする必要はない(retainにした場合、明示的にreleaseする事)

XCode周り

なんかミラクルおかしい!

オーガナイザーが糞重くなったり、ビルドしたけど謎のエラーで実行できなくなったりしたらとりあえずXCodeを再起動させてから考えると良いと思う。

リファレンスを見る

変数名などをOption+Clickするとヘルプが出てきます。

その他

UI周りの操作はMain Threadで行う。

UIに関する操作(例えばpushViewControllerとか)はmain threadで行うのが無難(詳しく追ってないので、経験上、としか言えないけど…) 別スレッドから操作したい時は、performSelectorOnMainThreadを呼べば楽。

iPhoneとか海外携帯のデバイス固有ID

written by shn, on Apr 6, 2009 11:19:00 PM.

海外だと、Anonymous Subscriber ID (ASID)って言うのかね?

iPhone SDK: Retrieving MSISDN or SIM ID for Authentication (iPhone forum at JavaRanch)

NSString *uniqueID = [[UIDevice currentDevice] uniqueIdentifier]

あとで読む

ASID Mobile WebSite Developers Cookbook

日本のは

携帯の端末IDとCookieのまとめ - ueblog

OSバージョンによる分岐

written by shn, on Mar 29, 2009 7:58:00 PM.

WINVER的な奴が欲しい。とりあえず、これで良さげ。

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2

iPhoneでCrash Logから関数の位置を特定する

written by shn, on Mar 15, 2009 2:54:00 AM.

iPhoneの素晴しいところの一つは、Crash Logが本体に保存される事なんですが、

Thread 0 Crashed:
0   libobjc.A.dylib                 0x300c8c18 objc_msgSend + 20
1   Fastweet2k                      0x00016240 0x1000 + 86592
2   UIKit                           0x30b2b414 -[UITextView keyboardInputChanged:] + 80
3   UIKit                           0x30bcaf1c -[UIWebDocumentView keyboardInputChanged:] + 40

このように、デバッグバイナリでもシンボルが出ないときがあります。 symolicatecrashを使ってもだめでがっかり。

でも、dSYMがあるから頑張ればなんとかなるんじゃね?とやってみたらなんとかなった。 普段VisualStudioの微温湯に浸かっている僕には大変でした。

% gdb --quiet Fastweet2k.app.dSYM/Contents/Resources/DWARF/Fastweet2k
(gdb) info line *0x16240
Line 179 of "/Users/shn/Documents/projects/git/fastweet/Classes/TweetViewController.m" starts at address 0x16212 <-[TweetViewController sendPressed:]+118> and ends at 0x162e4 <-[TweetViewController sendPressed:]+328>.

てな感じ。

上記のCrash Logはdebug版バイナリのものだったので、_./build/Debug-iphoneos/_にあるdSYMをgdbで開き、info lineコマンドで、対応するソースコードの位置が出てきます。

しかし、出てきたのは良いが何故ここでハングアップするのか、というか何故あの操作でこの関数が呼ばれるのか不明で泣きそう。

ついでに、symbolicatecrashの解説はここが詳しいです。