0

iOSプログラムの1つでメモリリークを回避しようとしています。私はそれをこれらに似たいくつかの行に釘付けにしたと思います:

NSString *s1Upper = [s1 uppercaseString];
s1Upper = [s1Upper stringByTrimmingCharactersInSet: 
    [NSCharacterSet whitespaceCharacterSet]]; 

(これらの2行は論理的な観点からは意味がないことを私は知っています、ただ私が持っている記憶の質問を説明するだけです。)

s1が@"abc"(スペースで終わる)であるとしましょう。NSStringsを理解する方法では、s1Upperは、コードの最初の行の後の1つのNSString(@ "ABC"はスペースで終わる)を指します。2行目以降は、別のNSString(スペースなしの@ "ABC")を指しています。

私の質問:最初のNSStringはいつリリースされますか?

私の推測では、現在のNSAutoreleasePoolが排出されるとリリースされます。その場合、フォローアップの質問があります。これに影響を与え、排水を制御するにはどうすればよいですか?

4

1 に答える 1

2

自動解放されます。つまり、自動解放プールが空になると解放されます。通常、現在の実行ループの最後にあります。

この場合、実際に変更することはできません。あなたができることはretainそれです、そしてreleaseあなたがそれが安全であると知ったときそれは後でそれです。これにより、自動解放プールのドレインで割り当てが解除されるのを防ぐことができます。

メソッドの内部実装が自動解放プールに移動するのを停止することはできません。オブジェクトを保持することによって、自動解放が保持カウントをゼロに落とさないことを確認することしかできません。

于 2012-04-17T22:15:02.517 に答える