0

ビューを何度も解放すると問題が発生します。理論的には単純ですが、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 少ない場合があります。

4

3 に答える 3

5

keepCount 値は使用しないでください。

真剣に、このような本当に役立つものにその値を使用しないでください。

メモリ リークがある場合、またはオーバーリリースが原因でクラッシュが発生した場合は、修正してください。これらはバグです。そして、これはそれらを処理する方法ではありません。

編集:常によく読んでください:メモリ管理ガイド

于 2010-10-12T07:08:41.753 に答える
1

-retainCount は使用しないでください。

オブジェクトの絶対保持カウントは無意味です。

releaseオブジェクトを保持させたのとまったく同じ回数呼び出す必要があります。それ以下ではなく (リークが好きでない限り)、もちろんそれ以上でもありません (クラッシュが好きでない限り)。

詳細については、メモリ管理ガイドラインを参照してください。


この特定のケースではrelease、オブジェクトを保持しなかったときにオブジェクトを ing することは、災害のレシピです。今はクラッシュしなくても、おそらくソフトウェアの更新または一見関係のない変更が原因で、いつかクラッシュするでしょう。メモリ管理が他の場所で間違っているため、今だけ機能している可能性があります。

述べたように、これは:

mainView = newView;
[newView release];

ビューのコピーを作成していません。さらに悪いことに、ビューを過度に解放しています (どこにも保持しないため)。

ビューでメソッドを使用するcopyことは適切な解決策ではありません。少なくとも、非常に非典型的です。UI 要素はそのようにはコピーされません。

示されているエラーを試しbuild and analyzeて修正しましたか?

leaks到達可能なメモリ内にリークされたオブジェクトへのポインタがまだ存在する可能性があるため、何も表示されない場合があります。

于 2010-10-31T18:37:28.133 に答える
0
mainView = newView;

コピーではなく譲渡です。保持カウントは増加しません。その後、リリースする必要はありません。

于 2010-10-12T07:22:47.357 に答える