nonatomic和atomic\retain和copy和assign之间的区别

来源:互联网 发布:软件评测师培训 编辑:程序博客网 时间:2024/04/29 16:03

1、nonatomic和atomic之间的区别
要与@synthesize一起使用才有意义。 atomic的意思就是setter/getter这个函数是一个原语操作。如果有多个线程同时调用setter的话,不会出现某一个线程执行setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样。 nonatomic不保证setter/getter的原语行,所以你可能会取到不完整的东西。 比如setter函数里面改变两个成员变量,如果你用nonatomic的话,getter可能会取到只更改了其中一个变量时候的状态。

2、copy\retain\assign
如果声明了retain的property,那就必须在dealloc中release。
IBOutlet建议使用property。
01.* assign: 简单赋值,不更改索引计数(Reference Counting)。
02.* copy: 建立一个索引计数为1的对象,然后释放旧对象。
03.* retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 

还可以这样理解: 
01.* 使用assign: 对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等);
02.* 使用copy: 对NSString;
03.* 使用retain: 对其他NSObject和其子类;
assign表示直接传递引用给属性值retain表示将某个对象引用传递给属性值时,属性值会将引用计数加一,也就是说,属性会自己额外保留一份引用.举例子说.NSObject a= [[NSObject alloc] init];classb.oneProperty = a;[a release];如果是assign的话,a被release之后,classb的oneProperty就不能再被使用.如果是retian的话,a被release之后,classb的oneProperty就可以继续使用.assign主要是int,long,bool原始数据类型.你可以试一试当你用原始数据类型retain的时候,编译会报错的。   assign 怀疑是多对一的关系,比如a被赋给b,c,d。则a,b,c,d都直接指向a的内存。结构如a->M,b->M,c->M,d->M。release时,都是直接释放M的空间。retain 怀疑也是多对一的关系,只是在assign的基础上增加了引用计数count。结构如a->M,b->M,c->M,d->M。release时,不是直接释放M,而是检查count,count>0,count--;否则,才释放M的空间。



alloc

为对象分配内存并返回该对象,其保留计数为1

您拥有以单词allocnew开头的任意方法创建的对象。

copy

为对象创建一份副本并返回该对象,其保留计数为1

如果您复制一个对象,您就拥有了这个对象的副本。这对于任何名字中包含单词copy的方法都是适用的,这里的“copy”是指被返回的对象。

retain

使一个对象的保留计数增加1

获得一个对象的所有权。

release

使一个对象的保留计数减少1

释放一个对象的所有权。

autorelease

使一个对象的引用计数在未来的某个阶段减少1

在未来的某个阶段释放一个对象的所有权。