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には依存関係がないのでこのような問題は起きないですね。