@property and assign, retain, copy的讲解和用法

本文详细解释了Objective-C中assign、retain和copy的区别,并通过实例演示了它们如何影响字符串对象的内存管理。此外还介绍了不同场景下选用这些属性的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举个例子:

    NSString *houseOfMM = [[NSString alloc] initWithString:'装梵几的三室两厅']; 

上面一段代码会执行以下两个动作:  

1 在堆上分配一段内存用来存储@' 装梵几的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' 装梵几的三室两厅' ,  
2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111    
 
下面分别看下(assign,retain,copy):  
1.assign的情况: NSString  * myHouse  = [ houseOfMM   assign ];  
此时 myHouse 和 houseOfMM 完全相同,地址都是 0XAAAA  ,内容为 0X1111  ,即 myHouse 只是 houseOfMM 的别名,对任何一个操作就等于对另一个操作。因此 retainCount 不需要增加.(同进同出,关系好,一把钥匙,给我拿着)  
2.retain的情况: NSString  *  myHouse  = [ houseOfMM   retain ];  
此时 myHouse 的地址不再为 0XAAAA ,可能为 0XAABB ,但是内容依然为 0X1111 .因此 myHouse 和 houseOfMM都可以管理' 装梵几的三室两厅 '所在的内存。因此  retainCount 需要增加1.(有些独立,各自进出,两把钥匙)  
3.copy的情况: NSString  *  myHouse  = [ houseOfMM   copy ];  
此时会在堆上重新开辟一段内存存放@'装梵几的三室两厅',比如0X1122,内容为@'装梵几的三室两厅',同时会在栈上为myHouse分配空间,比如地址:0XAACC,内容为0X1122,因此retainCount增加1供myHouse来管理0X1122这段内存.(两套@'装梵几的三室两厅',条件好,分居了,房子一人一套,所以钥匙一人一把。)
 

什么时候用assign,当然是破房子,简装的房子拉
基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)

什么时候用copy
含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷贝的房子)
但是NSMutableArray这样的不可以,Mutable的不能用copy,不然初始化会有问题。切记


什么时候用retain
其他NSObject和其子类对象好嘛 (大多数)

ARC中的strong相当于非ARC中的retain,ARC来了以后多搞一把钥匙就strong了啦。

 

From The Objective-C 2.0 Programming Language here is how assign retain and copy will be effectively implemented by @synthesize and how they should be functionally implemented by you if not synthesized.



property = newValue;
// retain
if (property != newValue)
{
[property release];
property = [newValue retain];
}
// copy
if (property != newValue)
{
[property release];
property = [newValue copy];
}




assign, retain, copy 属性是用来指定 setter 方法的工作方式:


 assign(default) 简单的赋值, assign不会对新的值做retain. 如果使用对象类型的参数, 同时没有启用 garbage collector, 不要使用assign 

 retain:  release旧的值, 同时retain新值. 这个属性用在参数为Objective‐C对象类型时.  如果启用了garbage  collector,  它和assign作用一样.  [启用了garbage collector. release和retain什么也不做.] 

 copy: 对新值做拷贝, 把拷贝赋值给变量. 变量为string时,常用该属性.

最后,我们还可以使用nonatomic属性.  如果我们的程序是多线程的.  那么让setter方法成为 atomic 是非常重要的.

转载于:https://www.cnblogs.com/tanwen1989/p/3599921.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值