@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を使用してください:)