[devdiv精华转载] ios开发 array的deep copy和convenience constructor写法(及深拷贝与浅拷贝说明)

原帖地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=31996&extra=page%3D1%26filter%3Ddigest%26digest%3D1%26digest%3D1

 

NSArray *newArray =[[NSArray alloc] addObjectsFromArray:oldArray];

array最简单的创建应该就是[NSArray arrayWithObject:@"aaaaa",@"bbbb",nil];

 

1. 先看看什么是深拷贝,什么是浅拷贝:
比如有这样一个结构体:
struct myStruct {
             char *p1;
        char* p2;
        char* p3;
};

定义了一个变量struct myStruct struct1;
比如struct1地址为addr1, struct1.p1地址为addr10,struct1.p2地址为addr11,struct1.p3地址为addr12,

又定义了一个变量struct myStruct struct2;

则把struct1浅copy到struct2的结果是:
struct2地址为addr2,struct2.p1地址为addr10,struct2.p2地址为addr11,
struct2.p2地址为addr12.
也就是说只是把结构体里面的指针地址copy了一下,而没有真正的把字符串复制过来。

2. 我试了一下NSArray和NSMutableArray提供的函数都是浅拷贝;实现深拷贝方式如下:

        // create an immutable array
        NSArray *arr = [NSArray arrayWithObjects: @"one", @"two", @"three", nil ];
        
        // create a mutable copy
        NSMutableArray *mut = [arr mutableCopy];
        
        //        shallow copy
        NSMutableArray *mut2 = [mut mutableCopy];
        
        //        deep copy this mutable array
        NSMutableArray *mut3 = [[NSMutableArray alloc] init];
        for(int i=0;i<[mut count]; i++) {
                
                NSString *temp = [[mut objectAtIndex:i] mutableCopy];
                [mut3 addObject:temp];
                [temp release];
        }

 

图片 2.png 

 


从上图我们可以看到mut和mut2除了对象地址不同外,他们包含的item都是一样的(地址是全部相同的,都是0x3030, 0x3040, 0x3050),也就是说从mut到mut2的copy只是简单的把item的地址复制了过来。
那深拷贝有什么不同呢?
深拷贝意味着不是简单的复制指针,而是把字符串内容复制到新的数组中,我们可以看到mut2的item地址已经变为0x3f19d00, 0x3f1f1a0, 0x3f1c970

 

 

 
我们再来检查0x3f1c970内存地址,打开memory browser,它的内容如图
图片 3.png 
经过查找它的第8个byte,我们可以看到真正的字符串地址为0x3f1b6e0,我们再用memory browser打开这个地址,可以看到one这个字符串确实存在这里
图片 4.png 
而原来的字符串,通过查找0x3050,找到字符串的存储位置为0x284a,它的内容如图
图片 5.png 
现在我们看到深拷贝时候,字符串从0x284a这个位置copy到0x3f1b6e0这个位置上,而浅拷贝根本就没有拷贝字符串,仅仅复制了一下指针

 

 

 

 

posted on 2011-12-06 11:43  Evalon  阅读(536)  评论(0)    收藏  举报

导航