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。
在未来的某个阶段释放一个对象的所有权。
要与@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。
在未来的某个阶段释放一个对象的所有权。
相关文章推荐
- iOS 关键字 copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用与区别
- iOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- iOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- copy,assign,strong,retain,weak,readonly,readwrite,nonatomic,atomic,unsafe_unretained的使用与区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- Objective-C开发之----atomic与nonatomic,assign,copy与retain的定义和区别
- retain,copy,assign,strong,weak,autorelease,nonatomic,atomic等得使用及区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- retain和copy还有assign的区别,atomic和nonatomic的用途
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- IOS atomic与nonatomic,assign,copy与retain的定义和区别
- [oc] IOS atomic与nonatomic,assign,copy与retain的定义和区别 【转】
- atomic与nonatomic,assign,copy与retain的定义和区别