0
    if (url_leng)
    {
        NSString *open_string;

        if      (g_system_status.language_code == 0)
            open_string = @"Open";
        else if (g_system_status.language_code == 1)
            open_string = @"Abrir";
        [open_string retain];
        [alert addButtonWithTitle : open_string];
        g_scan_result = targ_url;               
    }

上記のコードセグメントについて考えてみます。私の質問は「保持」ステートメントについてです。どういうわけか、コードを機能させるためにretainステートメントが必要です。私の唯一の説明は、open_stringがスコープ外になると、それに対してリリース呼び出しが行われるということです。したがって、値を保持するには、retain呼び出しが必要です。

誰かがこれを確認できることを願っています...

また、条件付きブロックの後に文字列のリリースステートメントが必要かどうかを尋ねたいですか?


更新:(あなたの親切な提案と貴重な洞察を読んだ後)

次の修正を試みました:

    if (url_leng)
    {            
        if      (g_system_status.language_code == 0)
            [alert addButtonWithTitle : @"Open"];
        else if (g_system_status.language_code == 1)
            [alert addButtonWithTitle : @"Abrir"];
        else
            [alert addButtonWithTitle : @"Open"];
        g_scan_result = targ_url;               
    }

今はすべて問題ないようです(retainステートメントがなくても)。

4

2 に答える 2

2

open_stringNSString文字列リテラルを指すポインタです。文字列リテラルはスタック上に存在します。文字列リテラルへの参照を渡すコードで、そのデータを保持したい場合は、それらをヒープにコピーします。オブジェクトを所有している場合(つまり、オブジェクトの保持/コピー/新規/割り当てと呼ばれる)、それを解放する責任があります。そうしないと、メモリリークが発生します。

于 2012-10-30T03:21:47.960 に答える
1

このretainコードでは、これは絶対に必要ありません。問題がある場合は、ここにはありません。アラートに割り当てられるとopen_string、もう必要ありません。他の場所でメモリ管理の問題が発生している必要があります。

おそらく問題は、language_codeが0と1以外の場合です。この場合、を正しく初期化することはできませんopen_string。少なくともnilを割り当てるか、この他のケースを何らかの方法で処理する必要があります。

ARCを検討し、あなたの生活をとても楽にしてください。

于 2012-10-30T03:18:42.510 に答える