浅谈IOS浅拷贝和深拷贝的区别

// 不可变对象==》不可变对象的copy 浅拷贝 地址不发生改变,相当于新的数组指向原来数组的地址,对任何一个进行release结果都一样

        NSArray * array = [[NSArray alloc]initWithObjects:@"1", @"2", nil];

        NSLog(@"array: %p %lu", array, array.retainCount);

        NSArray * array1 = [array copy];

        NSLog(@"array1: %p %lu", array1, array.retainCount);

        

        // 不可变对象==》可变对象的copy  深拷贝 地址发生改变,相当于新创建了一个可变数组,需要对新的数组(对象)进行一次release

        NSMutableArray * array2 = [array mutableCopy];

        NSLog(@"array2: %p %lu", array2, array2.retainCount);

        [array2 addObject:@"3"];

        NSLog(@"%@", array2);

        

        // 可变对象==》不可变对象copy  深拷贝  不论原来是可变对象还是不可变对象,copy后,就只会是不可变对象,地址发生改变,相当于新创建了一个不可变数组(对象),需要对新对象进行一次release

        NSMutableArray *array3 = [[NSMutableArray alloc]initWithObjects:@"a", @"b", nil];

        NSLog(@"array3: %p %lu", array3, array3.retainCount);

        NSArray *array4 = [array3 copy];

        NSLog(@"array4: %p %lu", array4, array4.retainCount);

        

        // 可变对象==》可变对象copy  深拷贝  不论原来是可变对象还是不可变对象,mutablecopy后,就只会是可变对象,地址发生改变,相当于创建了一个新的可变数组(对象),需要对新的对象进行release

        NSMutableArray *array5 = [array3 mutableCopy];

        NSLog(@"array5: %p %lu", array5, array5.retainCount);

        [array5 addObject:@"c"];

        NSLog(@"%@", array5);

        

        [array release];

        [array1 release];

        [array2 release];

        [array3 release];

        [array4 release];

        [array5 release];


猜你喜欢

转载自blog.csdn.net/xuwenjie198812/article/details/49204227