(assign,retain,copy):
2016-01-18 16:17
477 查看
举个例子:
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了啦。
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了啦。
相关文章推荐
- 美国末日AI之状态机(The Last Of Us AI)
- GPG key generation: Not enough random bytes available.
- Project Euler 102:Triangle containment 包含原点的三角形
- Syntax error, parameterized types are only available if source level is 1.5 or greater
- RAID5单块和多块硬盘故障如何恢复
- 3.3wait(long)
- GTP协议的分析 http://blog.csdn.net/stephen_yin/article/details/6951258
- <蜡烛图精解Candlestick Charting Explained>-- 笔记1
- GTP(GPRS Tunnelling Protocol)协议http://blog.csdn.net/stephen_yin/article/details/6951237
- 3.1等待/通知机制(wait/notify)
- [leetcode] 219. Contains Duplicate II 解题报告
- [leetcode] 217. Contains Duplicate 解题报告
- 学习NLP,AI,Deep Learning 的牛逼的教程
- 解决 Virtual Box 启动 Cannot load R0 module supLoadModule returned VERR_LDR_MISMATCH_NATIVE Failed to register ourselves as a PCI Bus (VERR_MODULE_NOT_FOUND)
- 彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误
- [Django](1093, "You can't specify target table 'fee_details_invoices' for update in FROM clause") 错误
- 适配器模式(Adapter Pattern)http://blog.csdn.net/kingliu_leo/article/details/5107373
- container宽度
- log4j 之 DailyRolling :屏蔽指定包日志输出
- TFS 503 Service Unavailable 解决方法