propertyを宣言する場合に、どの属性を指定すべきかまとめたものです。
primitive(非オブジェクト型): assign又は省略
NSIntegerやfloatなどのprimitive型はassignを指定するか、又は省略することができます。primitive型の場合、デフォルトがassignになっているからです。
Mutableなサブクラスがあるクラス
NSStringやNSArrayの様に、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