• copy 和 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是完全意义上的深拷贝

  • 相关阅读:
    SQL Server如何使用表变量
    Msys/MinGW与Cygwin/GCC(转)
    内存段划分:代码段、数据段、堆、栈
    Codeblocks+MinGW+wxWidgets搭建方法(转)
    Java GUI图形界面开发工具
    MinGW离线安装方法汇总(转)
    Linux系统的启动过程(转)
    详解VOLATILE在C++中的作用(转)
    C++虚函数与纯虚函数用法与区别(转)
    C++中值传递、指针传递和引用传递的比较 (转)
  • 原文地址:https://www.cnblogs.com/gaoxiao228/p/2464783.html
Copyright © 2020-2023  润新知