retain、copy、mutableCopy的区别
二、retain、copy、mutableCopy
(引用自:http://www.xcodechina.com/forum.php?mod=viewthread&tid=514)
|
代码: 定义一个属性: @property (copy,nonatomic)NSString *myTest; @synthesize myTest;
NSMutableString *temp = [[NSMutableStringalloc]initWithFormat:@"jjjjjj"]; self.myTest = temp; NSLog(@"%@ ",myTest); [temp appendString:@"adsdsdsd"]; NSLog(@"%@ ",myTest);
打印: 2013-02-20 11:45:41.129 Nimbus[2474:c07] jjjjjj
2013-02-20 11:45:41.131 Nimbus[2474:c07] jjjjjj
那如果用retian呢?? @property (retain,nonatomic)NSString *myTest; @synthesize myTest;
NSMutableString *temp = [[NSMutableStringalloc]initWithFormat:@"jjjjjj"]; self.myTest = temp; NSLog(@"%@ ",myTest); [temp appendString:@"adsdsdsd"]; NSLog(@"%@ ",myTest);
2013-02-20 11:48:46.794 Nimbus[2791:c07] jjjjjj 2013-02-20 11:48:46.795 Nimbus[2791:c07] jjjjjjadsdsdsd
声明的一个NSString *str变量,然后把一个NSMutableString *mStr变量的赋值给它了,如果要求str跟着mStr变化,那么就用retain;如果str不能跟着mStr一起变化,那就用copy。而对于要把NSString类型的字符串赋值给str,那两都没啥区别。不会影响安全性,内存管理也一样。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。 |
-------------------------------------------------------------------------------------------------
(引用自:http://blog.sina.com.cn/s/blog_6a0ae25a01014mlu.html)
NSString *a = [[NSString alloc]initWithString:@"hello"];
NSString *b = [a copy];
NSLog(@"%d %d",a.retainCount, b.retainCount);// 2,2
NSMutableString *f = [a mutableCopy];
NSLog(@"%d %d",a.retainCount, f.retainCount);// 2,1
[f appendString:@"dd"];
NSLog(@"%@,%@",a,f);// hello,hellodd // 对于一个不可变对象来说 copy 是浅copy 只是指针复制 其retainCount+1 // mutablecopy 是深copy 是对象复制
NSMutableString *c = [[NSMutableString alloc]initWithString:@"hello"];
NSMutableString *d = [c copy];
NSLog(@"%d %d",c.retainCount,d.retainCount);// 1,1
// [d appendString:@"ddd"]; //error 因为copy返回一个不可改变对象
NSMutableString *e = [c mutableCopy];
NSLog(@"%d %d",c.retainCount,e.retainCount);// 1,1
[e appendString:@"dddd"];
NSLog(@"%@,%@",c,e);// hello,hellodddd // 对于可变对象来说 copy 和mutablecopy 都是深copy 都是拷贝对象 不过copy返回的对象是一个不可变对象

浙公网安备 33010602011771号