• copy和mutableCopy的深、浅拷贝


    对象拷贝主要由两种方式:copy和mutableCopy。浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的。深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中。copy 返回的是一个不可变的对象,mutableCpoy返回的是一个可变的对象,但是由于OC的弱语法特性,即使如下使用编译器也不会报错。但是再运行时,arrayCopy会找不到具体的方法,报错。

    NSMutableArray *arrayCopy=[muArray copy];

    copy当所引用的对象是可变的时,则是深拷贝,如果是不可变对象则是浅拷贝。mutableCopy 不管对象是否为可变,都是深拷贝。

    int main(int argc, const char * argv[])
    {
        
        NSMutableArray *muArray=[[NSMutableArray alloc] init];
        
        //定义一个ClassA类,仅作测试用无实际意义
        ClassA *a=[[ClassA alloc] init];
        [muArray addObject:a];
        
        NSMutableArray *arrayCopy=[muArray copy];//如果调用add object:则会在运行时报错,但是编译时并不会报错(弱语法)
        NSMutableArray *arrayMutableCopy=[muArray mutableCopy];
        
        NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy);
        
        [a release];
        [muArray release];
        [arrayMutableCopy release];
        [arrayCopy release];
        return 0;
    }

    打印出来的结果是

    2015-01-23 12:06:58.342 Test[3375:303] 0x100100d40---0x1001023b0----0x100105020

    可以看出地址都不相同。

    int main(int argc, const char * argv[])
    {
        NSArray *array=@[@1,@2,@3];
        
        NSArray *arrayCopy=[array copy];
        NSMutableArray *arrayMutableCopy=[array mutableCopy];
        
        NSLog(@"%p---%p----%p----%ld",arrayCopy,array,arrayMutableCopy,[arrayCopy retainCount]);
        
        [arrayMutableCopy release];
        [arrayCopy release];
        return 0;
    }

    打印出来的结果是

     

    2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2

    可以看出使用copy出来的对象地址与原地址一样,也就是其实是同一个对象。且引用计数器也是2。

    与所有容器类一样,NSArray中存放的依旧是指针。并不是对象本身,其实数组中每个元素都是对象的地址。当我们使用浅拷贝时我们大部分人都能注意到对象共有的问题。如:

    int main(int argc, const char * argv[])
    {
    
        NSMutableArray *muArray=[[NSMutableArray alloc] init];
        
            //定义一个ClassA类,仅作测试用无实际意义
        ClassA *a=[[ClassA alloc] init];
        a.val=1;//原数组中,第一个对象的val是1
        [muArray addObject:a];
        
        NSArray *arrayCopy=[muArray copy];
        ClassA *b=arrayCopy[0];
        b.val=2;//将浅拷贝的数组,第一个元素的val变为2
        
        NSLog(@"%ld",[muArray[0] val]);
        
        [a release];
        [muArray release];
        [arrayCopy release];
        return 0;
    }
    

    打印结果为

    2015-01-23 12:21:32.972 Test[3443:303] 2

    即使是深拷贝,依然对原来的数组造成了影响。

     


    因为存放的都是地址,所以深拷贝时,将全部的地址拷了过去,但是还是指向同一个对象。

  • 相关阅读:
    ModelMap和ModelAndView的作用
    jquery 临时存值
    条件sql ibatis
    IBATIS动态SQL
    MyEclipse 快捷键
    jquery $用法
    弹窗案例
    Ibatis sql语句1
    Ibatis sql语句
    jQuery的三种$()
  • 原文地址:https://www.cnblogs.com/dengzhuli/p/4415568.html
Copyright © 2020-2023  润新知