-
(void)testCopy
{
NSArray * array = @[@"1",@"2",@"3"];
NSArray * arr2 = [array copy];
NSMutableArray * mul = [array mutableCopy];
NSString * oriFirst = [array firstObject];
NSString * mulFirst = [mul firstObject];
NSLog(@"%@\n%@",array.firstObject,mul.firstObject);/**
Printing description of array:
<__NSArrayI 0x618000241c80>(
1,
2,
3
)
Printing description of arr2:
<__NSArrayI 0x618000241c80>(
1,
2,
3
)
Printing description of mul:
<__NSArrayM 0x618000242ca0>(
1,
2,
3
)
可以见到,对于不可变的 arr 如果进行 copy 的话会进行浅拷贝,如果 mutableCopy 会进行内容拷贝。但是,通过图 3-2 打印出的地址信息,这里的内容拷贝仅仅是拷贝 array 这个对象,array 集合内的元素仍然是指针拷贝。所以可以定义为是单层深拷贝。
*/
NSMutableArray * newMul = [NSMutableArray array];
[newMul addObject:@"new1"];
[newMul addObject:@"new2"];
NSArray * copyMul = [newMul copy];
NSMutableArray * copyMul2 = [newMul mutableCopy];
NSString * oriFirst_ = [newMul firstObject];
NSString * mulFirst_ = [copyMul2 firstObject];
/**
(__NSCFConstantString *) $1 = 0x000000010f1daf10 @"1"
Printing description of newMul:
<__NSArrayM 0x60000004bee0>(
new1,
new2
)
Printing description of copyMul:
<__NSArrayI 0x60000003ec00>(
new1,
new2
)
Printing description of copyMul2:
<__NSArrayM 0x60000004fab0>(
new1,
new2
)
对于可变的集合元素的 copy 与 mutableCopy 都是单层深复制。
*/
NSLog(@"hello");
/**
对于非集合对象
copy:因为copy默认返回的是不可变的,所以当我们对一个不可变的字符串进行copy的时候,我们只是拷贝了它的指针(浅拷贝)。当我们对一个可变的字符串进行拷贝的时候,因为类型转变了,我们需对其进行深拷贝。
mutableCopy:默认返回的是一个可变的对象,适用于可变的对象,例如NSMutableString,NSMutableArray,NSMutableDictionary、etc。 无论对于可变的字符串还是不可变的字符串进行mutableCopy,系统都默认进行深拷贝,那么为什么对于相同类型的进行mutableCopy返回的仍然是新的对象呢,因为在这里系统要保证,旧的对象和新的对象都是可变的,切他们之前不会相互影响。
对于集合对象
对于不可变的集合对象,copy 是浅拷贝,mutableCopy 是单层深拷贝。
对于可变的集合对象,无论 copy 或者 mutableCopy 都是单层深拷贝。
*/
}
网友评论