iPhoneアプリが落ちるのはretainされていないオブジェクトの使用が最も多い

初めてiPhoneアプリを書いていたとき、すごく苦労したのがオブジェクトのretainです。

失敗例はこのパターン

UIViewController *myViewController = [[UIViewController alloc] init];
[window addSubview:myViewController.view];

[myViewController release];


そりゃ落ちますわな。windowが保持(retain)しているのはviewであってmyViewControllerではない。つまりmyViewControllerは誰にも保持(retain)されていないので、メモリが解放されてしまっています。

これで表示されたviewの部品(ボタンとか)を触ろうものなら、どっかーんと落ちてしまいます。これは単純な例ですが、これは結構やってしまうミスです。

Javaプログラマからするとあり得ないのですが、Objective-Cは、retainしすぎるとメモリリークするし、retainが足りないと解放されたオブジェクトにアクセスしアプリが落ちてしまうし。

Objective-Cは、C言語の柔軟性とオブジェクト指向を兼ね備えた良い言語だと思うけど、オブジェクトのretainは自分にルールができるまでは、結構苦労する問題です。