ビューを何度も解放すると問題が発生します。理論的には単純ですが、uiview を uiview のサブクラスである uiview に移動し、アニメーション化するなど、簡単に修正できるものではないためです。10% しかクラッシュせず、特定の条件下でのみクラッシュし、これらの条件下でも 30% の確率でしかクラッシュしません。
言い換えれば、ちょっと複雑です。私の dealloc メソッドでは、この UIView の保持カウントが既に 1 (ビューが解放されると解放される) であるため、再度解放するべきではありません。だから私がしたことはこれです:
if ([mainView retainCount] > 1) {
NSLog(@"released");
[mainView release];
}
リリースされたクラッシュと一致することが通常呼び出されますが、常にではなく、時々クラッシュすると予想されるときにほとんど発生します。このコードでリークをチェックしましたが、リークすることはありません。
さて、実際の質問です...保持カウントのために何かをリリースするのは間違っていますか? これを修正するためにさまざまな方法を試しましたが、これまでのところ、信頼性が高く、漏れのない唯一の方法です。
編集:そうでない場合、あるUIViewを別のUIViewにコピーするより良い方法は何ですか?
mainView = newView;
[newView release];
最初に mainView を解放してから newView で copy を呼び出してみましたが、これはクラッシュします。上記も完全に機能しますが、コード内のどこにもリリースされていないにもかかわらず、保持カウントが予想よりも 1 少ない場合があります。