assign retain 和copy的区别

assign

对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char)等 等. 此标记说明设置器直接进?行赋值,这也是默认值。在使?用垃圾收集的应?用程序中,如 果你要?一个属性使?用assign,且这个类符合NSCopying协 议,你就要明确指出这个标 记,?而不是简单地使?用默认值,否则的话,你将得到?一个编译警告。这再次向编译器说 明你确实需要赋值,即使它是可拷?贝的。

retain对其他NSObject和其?子类对参数进?行release旧值,再retain新值指定retain会在赋 值时唤醒传?入值的retain消息。此属性只能?用于Objective-C对象类型,?而不能?用于Core

Foundation对象。(原因很明显,retain会增加对象的引?用计数,?而基本数据类型或者 Core Foundation对象都没有引?用计数——译者注)。

注意: 把对象添加到数组中时,引?用计数将增加对象的引?用次数+1。

copy

对NSString 它指出,在赋值时使?用传?入值的?一份拷?贝。拷?贝?工作由copy?方法执?行,此属 性只对那些实?行了NSCopying协议的对象类型有效。更深?入的讨论,请参考“复制”部 分。?copy与retain:

Copy其实是建?立了?一个相同的对象,?而retain不是:?1.?比如?一个NSString 对象,地址为0×1111 ,内容为@”STR”,Copy 到另外?一个 NSString 之后,地址为0×2222 ,内容相同。?2.新的对象retain为1 ,旧有对象没有变化retain 到另外?一个NSString 之后,地址相同 (建?立?一个指针,指针拷?贝),内容当然相同,这个对象的retain值+1。?总结:retain 是指针拷?贝,copy 是内容拷?贝。?assign与retain:?1. 接触过C,那么假设你?用malloc分配了?一块内存,并且把它的地址赋值给了指针a, 后来你希望指针b也共享这块内存,于是你?又把a赋值给(assign)了b。此时a和b指向 同?一块内存,请问当a不再需要这块内存,能否直接释放它?答案是否定的,因为a并不 知道b是否还在使?用这块内存,如果a释放了,那么b在使?用这块内存的时候会引起程序 crash掉。?2. 了解到1中assign的问题,那么如何解决?最简单的?一个?方法就是使?用引?用计数 (reference counting),还是上?面的那个例?子,我们给那块内存设?一个引?用计数,当 内存被分配并且赋值给a时,引?用计数是1。当把a赋值给b时引?用计数增加到2。这时如 果a不再使?用这块内存,它只需要把引?用计数减1,表明?自?己不再拥有这块内存。b不再 使?用这块内存时也把引?用计数减1。当引?用计数变为0的时候,代表该内存不再被任何指 针所引?用,系统可以把它直接释放掉。 总结:上?面两点其实就是assign和retain的区别,assign就是直接赋值,从?而可能引起 1中的问题,当数据为int, float等原?生类型时,可以使?用assign。retain就如2中所述, 使?用了引?用计数,retain引起引?用计数加1, release引起引?用计数减1,当引?用计数为0 时,dealloc函数被调?用,内存被回收。

assign retain 和copy的区别

时间: 2024-10-10 13:01:02

assign retain 和copy的区别的相关文章

IOS中Retain和Copy的区别

IOS中Retain和Copy的区别 1 ,可读性: readonly  . readwrite@property(readwrite,....) valueType value;这个属性是变量的默认属性,就是如果你 (readwrite and readonly 都没有使用,那么你的变量就是 readwrite 属性 ) ,通过加入 readwrite 属性你的变量就会有 get 方法,和 set 方法.property(readonly,...) valueType value;这个属性变量

retain和copy的区别

原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别.那究竟是有什么区别呢? assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们. Retain vs. Copy!! copy: 建立一个索引计数为1的对象,然后释放旧对象 retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 那上面的是什么该死的意思呢? Copy其实是建立了一个相同的对象,而retain不是: 比如一个NSString对象

ios retain 与 copy 的区别

.retain 与copy区别 retain 的仅仅是引用计数加1,但是并没有创建新的对象.它们的指针是指向相同的内存地址. copy 是创建一个新的对象作为原来对象的副本,新创建出来的引用计数并没有加1. copy 有两中协议 第一种NSCopying 与NSMutableCopying 一种是可变复制,一种是不可变复制 : 可变是通过 mutableCopy 来实现可变的复制 : 不可变是通过 copy 直接复制得到: 常用复制的的有:NSArray,NSNumber(只有不可变的复制),N

Object C中retain和copy的区别

一个NSString对象,地址为0×1111,内容为@”XXXXX” Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化 retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1 也就是说,retain是指针拷贝,copy是内容拷贝

atomic与nonatomic,assign,copy与retain的定义和区别

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样: {lock} f (property != newValue) { [property release]; property = [newValue retain]; } {unlock} nonat

iOS开发-assign、retain、copy、strong、weak的区别

对于初学的开发者,对于assign.retain.copy.strong.weak的用法及意义可能不是很明白,我对于这个问题也研究了很久,写篇博文,巧巧代码,让我们来瞧瞧吧! 先定义一个Student类: #import <Foundation/Foundation.h> @interface Student : NSObject @property (nonatomic, copy) NSString *name; @end 然后先是mrc下的assign声明 @property (nona

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法:readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用:alloc 对象分配后引用计数为1retain 对象的引用计数+1 copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出):用于基础数据类型:weak:由ARC引入的对象变量的属性,比assign多了一个

object-c中的assign,retain,copy,atomic,nonatomic,readonly,readwrite以及strong,weak

assign:指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy.assign指定setter方法用简单的赋值,这是默认操作.你可以对标量类型(如int)使用这个属性.你可以想象一个float,它不是一个对象,所以它不能retain.copy. retain:指定retain应该在后面的对象上调用,前一个值发送一条release消息.你可以想象一个NSString实例,它是一个对象,

属性readwrite,readonly,assign,retain,copy,nonatomic

copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效.更深入的讨论,请参考“复制”部分. retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1对其他NSObject和其子类对参数进行release旧值,再retain新值指定retain会在赋值时唤醒传入值的retain消息.此属性只能用于Objective