0

iOS アプリでメモリ リークが発生しました。IOS でのメモリ管理は初めてです。以下の問題に対処する方法を提案してください。

リークしている変数は content です。以下のコードで示した方法 (現在はコメントアウトされています) をリリースしても、オブジェクトはまだリークしています。また、while ループは常に 1 回実行されます。

if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
            // We "step" through the results - once for each row.
            while (sqlite3_step(statement) == SQLITE_ROW) {


                content  = [[NSString alloc] initWithUTF8String:
                            (const char *) sqlite3_column_text(statement, 1)];

            }
        }
    }

    detailsArtViewController *det = [[detailsArtViewController alloc] init];

    NSString *decodeString = [self htmlEntityDecode:content];
    //[content release];
4

2 に答える 2

2

すべての alloc/init は、どこかで release または autorelease とバランスを取る必要があります。あなたのVCのリリースも、以前の値のリリースもありませcontentん。

したがって、コードにいくつかの問題があります。

  • whileループが複数回実行された場合、保護はありません(実際には、まったく実行されない場合 (SQL エラーまたは結果なし) に対する保護はないようですが、それは別の問題です) . 結果が期待したものと異なる場合、リークが発生することを意味します。
  • したがって、コンテンツの以前の値を解放してから、ループ内の新しい値に割り当てる必要があります。これにより、コンテンツがゼロでない場合、メモリのバランスが取れます。ちなみに、ivar の代わりにプロパティを使用する方がより安全である理由の 1 つは、これが理由です。以下を参照してください。
  • detailsArtViewControllerはリリースされないため、リークの原因になる可能性もあります(ちなみに、クラス名は大文字で始める必要があります。命名規則に従うことで、他の人がコードをよりよく理解し、シンボルが何であるかを理解するための多くの手間を省くことができます)。 、KVC が機能することを確認するなど、できるだけ早く採用する必要があります)

ここに複数の提案がありますが、従うことを強くお勧めします。

  • ドキュメント読み、メモリ管理ポリシーに従ってください。ルールは非常に単純です (すべてのalloc/copy//mutableCopyによってバランスが取れている必要があります。これだけ知っておく必要があります。少なくとも基本的に最も重要なルールです)。releaseautorelease
  • インスタンス変数の代わりにプロパティを使用することを強くお勧めします(contentあなたの場合、ローカル変数ではなく ivar の場合?)。iOS の初期から利用できるモダン ランタイムのおかげで、プロパティのインスタンス変数を作成する必要はありません@synthesize。 、@synthesizeとにかくディレクティブさえ必要ありません)。self.contentインスタンス変数の代わりに(代わりに使用してcontent)プロパティをあらゆる場所で使用すると、プロパティのセッターが確実に呼び出されるため、メモリ管理が適切に行われ、以前の値が解放され、新しい値が保持されます (retainそのため、インスタンス変数を直接使用する場合とは異なり、古い値を解放することを心配する必要はありません。
  • ARC を使用して、リークを回避し、自分で/ danceを行う必要がないようにすることができretainreleaseます。もちろんARC、「メモリ管理について学ぶことを避ける方法」としてはお勧めしません。少なくとも保持サイクルやそのようなものを避けるために、メモリ管理がどのように機能するかを理解することは依然として非常に役立ちますが、回避することで物事が簡単retainになります/呼び出しにrelease煩わされるため、ロジックと微妙な点 (ARC でも発生する可能性がある) を理解するためにメモリ管理について学習することをお勧めしますが、初心者にとっては一般的に簡単です。
于 2012-09-12T21:20:53.707 に答える
0

ARC に移行すれば、このリークについてまったく心配する必要はありません。初心者に最適です。

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

于 2012-09-12T21:16:05.270 に答える