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返回的对象是一个不可变对象

posted @ 2013-10-14 18:29  陨宇  阅读(236)  评论(0)    收藏  举报