(官方SDK,对NSString属性的定义都是用copy,而不是retain)
在明了的原因是,怕你赋值的是一个MutableString,而MutableString是可变了,如果只是retain,那么当你在外面改变了这个值的时候,你的属性的值也改变了

代码:
定义一个属性:
@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:始终是深复制,引用计数不改变。始终返回一个可变对象

 =====================================================================================

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返回的对象是一个不可变对象
//------------------------------------------------------------//
// 对于系统容器类对象

NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
NSArray *array1Copy = [array1 copy];
NSLog(@"%d, %d",array1.retainCount,array1Copy.retainCount);//2,2
NSMutableArray *arrayMcopy = [array1 mutableCopy];
NSLog(@"%d, %d",array1.retainCount,arrayMcopy.retainCount);//2,1
[arrayMcopy removeObjectAtIndex:0];
[arrayMcopy addObject:@"d"];
NSLog(@"%@-----%@",array1,arrayMcopy);//a,b,c -----b,c,d
NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *mArray1copy = [mArray1 copy];
NSLog(@"%d,%d",mArray1.retainCount,mArray1copy.retainCount);//2,2
NSMutableArray *mArrayMcopy = [mArray1 mutableCopy];
NSLog(@"%d,%d",mArray1.retainCount,mArrayMcopy.retainCount);//2,1
NSMutableString *temp = [mArray1 objectAtIndex:0];
NSLog(@"%@",temp);//a
[temp appendString:@"aa"];
NSLog(@"%@",mArray1);//aaa b c
NSLog(@"%@",mArray1copy); //aaa b c
NSLog(@"%@",mArrayMcopy);// aaa b c
//对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。
NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject: mArray1]];
NSMutableString *temp2 = [trueDeepCopyArray objectAtIndex:0];
[temp2 appendString:@"aa"];

NSLog(@"%@",mArray1);//aaa b c
NSLog(@"%@",trueDeepCopyArray);//aaaaa b c
//trueDeepCopyArray是完全意义上的深拷贝

 

 

结论:1,对于一个不可变对象来说 copy 是浅copy 只是指针复制 其retainCount+1
   2,  mutablecopy 是深copy 是对象复制

       3,对于可变对象来说 copy 和mutablecopy 都是深copy 都是拷贝对象 不过copy返回的对象是一个不可变对象

   4,对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。

posted on 2013-12-18 10:36  wangzh@博客园  阅读(304)  评论(0编辑  收藏  举报