zoukankan      html  css  js  c++  java
  • retain,copy,mutableCopy的区别

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

  • 相关阅读:
    面试总结
    java高级开发
    idea的快捷键
    微服务面试题目
    windows下jenkins的安装与配置
    微服务面试集合
    springlcoud中使用consul作为注册中心
    乐观锁和悲观锁
    volatile与synchronized的区别
    Java CAS 和ABA问题
  • 原文地址:https://www.cnblogs.com/wangzh1225/p/3479839.html
Copyright © 2011-2022 走看看