-2

これを解決してください。

NSString *S1 = @"abc";
//retain count of s1 ??

NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??

NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??

NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??

NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??

retainCount正確な結果が得られないと私は信じているので、提案しないでください。

4

2 に答える 2

9

正確な結果が得られないと私は信じているので、retainCountを提案しないでください。

正しい。 retainCount役に立たない。www.whentouseretaincount.com

保持カウントをデルタとして有効に推論することしかできません。


あなたの質問に答えるために、そのコードの場合、保持カウントは定数であり、コードのどの行も実際には何もしません。そのコードの最後では、S2、S3、およびS4はすべて同じ値になります。すべて同じ文字列を指します(そして、明らかに、S1は別の文字列を指します)。

これは、実装の詳細によるものです。定数文字列を使用しています。事実上、シングルトンです。したがって、文字列をコピーする必要はなく(copy単にコピーするだけですreturn self;)、retain / release/autoreleaseメソッドはまったく何もしません。

于 2013-01-17T17:52:41.560 に答える
2

@KurtRevisからの説明のおかげで編集

もちろん、ARCがオフになっていると仮定すると、これを自分でテストできます。しかし、なぜこれらの結果が得られているのか理解できないかもしれません。これがあなたが得るべきものとその理由です。

NSString *S1 = @"abc";
//retain count of s1 ??

S1は定数文字列リテラルであり、アプリが実行されている限りメモリを離れることはありません。したがって、保持カウントは一種の無関係です。

NSString *S2 = [S1 copy];
//retain count of s2 and s1 ??

S1変更されていません。 は、保持カウントが1で、自動リリースがないS2のコピーです。S1

NSString *S3 = [S2 copy];
//retain count of s3 and s2 ??

S2自動リリースなしで1で変更されません。 は、保持カウントが1で、自動リリースがないS3のコピーです。S2

NSString *S4 = [S3 retain];
//retain count of s4 and s3 ??

S4そしてS3、同じオブジェクトを指しています。そして、その1つのオブジェクトの保持カウントは2になり、自動解放されます。自動リリースがトリガーされると、保持カウントは1になり、割り当てが解除されません。

NSString *S1 = @"xyz";
//retain count of s1, s2, s3 and s4 ??

S1指すために使用された古いオブジェクトは変更されていません。これはメモリ内の永続的な文字列です。そして今S1、以前と同じように扱われる新しい文字列をS1指します。


または、頭痛の種を避けてARCを使用してください:)

于 2013-01-17T07:06:11.353 に答える