EXC_BAD_ACCESS

実機で実行するとEXC_BAD_ACCESSで落ちて、シミュレータでは問題なく、実機でステップ実行して原因を絞り込もうとすると再現しないというなんとも典型的なハイゼンバグ。

iPhoneアプリなのに「時間のかかる処理にプログレスバーが出ないなんて許せない」なんて思ってしまったがためにNSThreadとかNSAutoreleasePoolとか出てきて涙目。

Cocoaでいこう! Macらしく 第10回

なんと。英語で読んで「retainする必要がある」って書いてあったのを普通の動詞だと思って「保持する必要がある」だと思ったが、retainってメッセージがあるのか。retainはPy_IncRefのようなもの。覚えた。


さて、retainが必要だということを学習したのでソースを改めて見てみる。まず、ボタンを押したイベントのハンドラの中で受け取った値を別のスレッドに渡しているが、retainしていない。この引数がautoreleaseされているなら別スレッドに渡したあと解放されてしまう。retainが必要。