Cocoa環境では通常、alloc して init すると参照カウンタの値は1になる。
NSObject * object = [[NSObject alloc] init];
NSLog(@"NSObject init Count %d", [object retainCount]);
// NSObject Init Count 1


しかし NSString は例外。普通に init しただけでは参照カウンタの値は signed int の最大値になる。これはバグなのか仕様なのか?たぶんリテラルで生成されたNSStringオブジェクトとの整合性を取るためだと推測する。まぁ init だけって使い方はまず無い。
NSString * string = [[NSString alloc] init];
NSLog(@"NSString init Count %d", [string retainCount]);
// NSString Init Count 2147483647


フォーマット指定で文字列を生成すると参照カウンタは1になる。これが期待する動き。
NSString * string = [[NSString alloc] initWithFormat:@"TEST"];
NSLog(@"NSString initWithFormat Count %d", [string retainCount]);
// NSString initWithFormat Count 1


しかし、例えば参照カウンタが3のNSStringオブジェクトを元に新しいオブジェクトを生成すると参照カウンタの値を引き継ぐ。メモリの消費を押さえる為に元となったオブジェクトのデータを参照していると推測できる。つまり、ただのエイリアス。
NSLog(@"aString Count %d", [aString retainCount]);
// aString Count 3
NSString * string = [[NSString alloc] initWithString:aString];
NSLog(@"NSString initWithString Count %d", [string retainCount]);
// aString Count 4
// NSString initWithString Count 4


NSStringは生成後に変更を加えれないので元のデータを参照しても問題無いが、NSMutableString の場合はどうなるのか?エイリアスだと文字列に変更を加えると元のデータも変更されてしまうのでこれはまずい。テストすると予想通り参照カウンタは1になる。つまり、完全に新しいオブジェクトが生成されている。
// NSString * aString
NSLog(@"aString Count %d", [aString retainCount]);
// aString Count 3
NSMutableString * mString = [[NSMutableString alloc] initWithString:aString];
NSLog(@"NSMutableString initWithString Count %d", [mString retainCount]);
// NSMutableString initWithString Count 1


逆のパターン、つまり NSMutableString を元に NSString を生成した場合も同様に参照カウンタは1になる。

NSLog(@"mString Count %d", [mString retainCount]);
// mString Count 3
string = [[NSString alloc] initWithString:mString];
NSLog(@"NSString initWithString Count %d", [string retainCount]);
//NSString initWithString Count 1


これらの結果を元に内部の処理を考えると、NSString を元に NSString を init した場合ただのエイリアスを生成してメモリを節約している と想像することができる。

以下の方法で裏を取ることがきる。
aString を元に string を生成し、その後 aString を retain する。結果は両方の retainCount が +1 されていた。
// NSString * aString (retainCount 3)
string = [aString copy];
NSLog(@"string Count %d", [string retainCount]);
[aString retain];
NSLog(@"string Count %d", [string retainCount]);
NSLog(@"aString Count %d", [aString retainCount]);
// string Count 4
// aString Count 4


結論として、NSString を元に NSString を init した場合ただのエイリアスを生成してメモリを節約している。