NSStringのpropertyはcopy属性にするべき
NSStringを引数にもつセッタのproperty定義で retainとcopyで議論がありますが、Google Objective-Cスタイルガイドでは copyを推奨しているようです。
セッタではNSStringをコピーする(Google Objectieve-Cスタイルガイド 日本語訳)
@interface Foo : NSObject { @private NSString *foo_; } @property (nonatomic, copy) NSString *foo; @end @ implementation Foo @synthesize foo = foo_; @end
引数に対して可変なNSMutableStringを受ける可能性があり、知らないうちに参照元の値が変わることを防ぐ目的で、安全を期してcopyにするという理由のようです。
前提の背景として特殊的にNSStringはcopyしても実際にはコピーされず、同じアドレスを指すようになります。NSMutableStringの場合は通常オブジェクトと同様にコピーされ、新しい領域を確保されます。
こちらで検証されています。
http://doruby.kbmj.com/snak/20090309/copy_retain
何はともあれNSStringのretainもcopyも挙動は同じなのですが、暗黙的な意味もありNSStringのpropertyにはcopyを使った方がよさそうです。
JavaのStringインスタンスをrewriteする仕掛けがないのと同じですが、StringとStringBuilderには依存関係がないのでこのような問題は起きないですね。