assign用于简单数据类型,如NSInteger,double,bool
retain和copy用于对象
copy用于当a指向一个对象,b也想指向同样的对象的时候,如果用assign,a如果释放,再调用b会crash,如果用copy的方式,a和b各自有自己的内存,就可以解决这个问题。
retain会使计数器加1,也可以解决assign的问题
另外:atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作
在多线程环境下,原子操作是必要的,否则有可能引起错误的结果
加了atomic,setter函数会变成下面这样
if (property != newValue)
{
[property realse];
property = [newValue retain];
}