[devdiv精华转载] ios开发 array的deep copy和convenience constructor写法(及深拷贝与浅拷贝说明)
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];
}
从上图我们可以看到mut和mut2除了对象地址不同外,他们包含的item都是一样的(地址是全部相同的,都是0x3030, 0x3040, 0x3050),也就是说从mut到mut2的copy只是简单的把item的地址复制了过来。
那深拷贝有什么不同呢?
深拷贝意味着不是简单的复制指针,而是把字符串内容复制到新的数组中,我们可以看到mut2的item地址已经变为0x3f19d00, 0x3f1f1a0, 0x3f1c970
|
浙公网安备 33010602011771号