OC学习 -- 浅拷贝和深拷贝

浅拷贝和深拷贝区别是什么?

浅拷贝就是指 指针的赋值 深拷贝就是开辟了一个新的空间

在有指针的情况下,浅拷贝只是增加了一个指针指向已经存在的内存.
深拷贝就是增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存.
采用深拷贝的情况下,释放内存的时候就不会出现在浅拷贝时重复释放同一内存的错误.

    Person *per1 = [[Person alloc]init];
        Person *per2 = [[Person alloc]init];
        Person *per3 = [[Person alloc]init];
        NSLog(@"%lu %p",[per1 retainCount],per1);
        NSArray *arr = [[NSArray alloc]initWithObjects:per1,per2,per3, nil];
        NSLog(@"arr[0] : %lu %p",[arr[0] retainCount],arr[0]);
        //不可变数组是一个浅拷贝 相当于retain操作..对数组元素也是浅拷贝 是简单的指针赋值 引用计数没有变化
        //对数组进行copy
        NSArray *copyArr = [arr copy];
        NSLog(@"%p %p",arr,copyArr);  //不可变的数组 是浅拷贝
        NSLog(@"%lu ",[arr retainCount]);
        NSLog(@"%lu",[arr[0] retainCount]);

        NSMutableArray *muArr = [[NSMutableArray alloc]initWithObjects:per1,per2,per3, nil];
        NSLog(@"per1 %lu",[per1 retainCount]);
        //对于可变数组 是一个深拷贝 产生了一个新的数组对象 但是对于不可变数组内的数组元素是浅拷贝,相当于retain操作..
        NSMutableArray *copyMuarr = [muArr copy];
        NSLog(@"%p %p",muArr,copyMuarr);
        NSLog(@"%lu %lu",[muArr retainCount],[copyMuarr retainCount]);
        NSLog(@"%p %lu %p %lu",muArr[0],[muArr[0] retainCount],copyMuarr[0],[copyMuarr[0] retainCount]);

你可能感兴趣的:(内存,深拷贝,浅拷贝)