Hatena::ブログ(Diary)

中継地点 RSSフィード Twitter

2011-07-18

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の場合は通常オブジェクトと同様にコピーされ、新しい領域を確保されます。

こちらで検証されています。

404 Not Found


何はともあれNSStringのretainもcopyも挙動は同じなのですが、暗黙的な意味もありNSStringのpropertyにはcopyを使った方がよさそうです。

JavaのStringインスタンスrewriteする仕掛けがないのと同じですが、StringとStringBuilderには依存関係がないのでこのような問題は起きないですね。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/h_mori/20110718/1310949854
Connection: close