您的位置:首页 > 大数据 > 人工智能

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

2012-07-16 10:09 344 查看
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的空间。

为对象分配内存并返回该对象,其保留计数为1。
您拥有以单词alloc或new开头的任意方法创建的对象。
copy
为对象创建一份副本并返回该对象,其保留计数为1。
如果您复制一个对象,您就拥有了这个对象的副本。这对于任何名字中包含单词copy的方法都是适用的,这里的“copy”是指被返回的对象。
retain
使一个对象的保留计数增加1。
获得一个对象的所有权。
release
使一个对象的保留计数减少1。
释放一个对象的所有权。
autorelease
使一个对象的引用计数在未来的某个阶段减少1。
在未来的某个阶段释放一个对象的所有权。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  setter reference getter float c