copy multablecopy

  • (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 都是单层深拷贝。
 

 */

}

你可能感兴趣的:(copy multablecopy)