(官方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,对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。