propertyの属性

Posted on
Objective-c

propertyを宣言する場合に、どの属性を指定すべきかまとめたものです。

primitive(非オブジェクト型): assign又は省略

NSIntegerやfloatなどのprimitive型はassignを指定するか、又は省略することができます。primitive型の場合、デフォルトがassignになっているからです。

Mutableなサブクラスがあるクラス

NSStringNSArrayの様に、mutableなサブクラスがある場合、copyを指定します。

NSMutableString *string = [NSMutableString  stringWithString @"abc"];

MyClass *obj = [[MyClass alloc] init];
obj.str = string;

[string appendString:@"def"];
// if strong, obj.str will be @"abcdef"
// if copy, obj.str will be @"abc"

propertyの属性にcopyを指定するか、strongを指定するかで値が変わりますね。NSStringというimmutableなクラスのインスタンスなのに、知らぬ所で変更が加えられると、想定しない挙動を起こし、不具合の元になります。

block

blockもcopyを指定します。blockは本来stackに存在するので、スコープを抜けると解放されてしまいます。スコープを抜けた後も参照したい場合は、[block copy]をすることによって、ヒープにblockを作成します。

delegate

delegateは循環参照を避けるために、weakを指定します。

その他のオブジェクト

strongを指定するか、省略します。オブジェクト型はデフォルトでstrongが指定されるので、省略する事ができます。

参考

http://qiita.com/uasi/items/80660f9aa20afaf671f3

http://stackoverflow.com/questions/387959/nsstring-property-copy-or-retain