免费开源的iOS开发学习平台

OC对象复制:2-可变对象与不可变对象复制

在Foundation框架中,常用的几个类,如NSString、NSArray以及NSDictionary都有其对应的可变子类。当对不同类的对象进行复制时,系统会采用不同的复制方式,有的采用浅复制,有的采用深复制,因此有必要去提前了解对不同类型的对象进行复制时,得到的拷贝结果是拷贝的指针(浅复制),还是具体的内容(深复制)。

1、拷贝操作(copy与mutableCopy方法)

在NSObject类中提供了两种复制的实例方法,copymutableCopy。copy方法,得到的是不可变对象,不管以前的是可变还是不可变。mutableCopy方法,得到的是可变对象,不管以前的是可变还是不可变。

当对不同类型的对象分别使用copy和mutableCopy方法进行复制时,可能对应不同的复制类型(深复制OR浅复制)。

- (id)copy;
- (id)mutableCopy;

2、可变对象与不可变对象

在Foundation框架中,常用的几个不可变的类,如NSString,NSArray,NSDictionary都有对应的可变子类(NSMutableString,NSMutableArray,NSMutableDictionary)。

不可变的类实例化后的对象,分配的内存空间不能再变化,而可变类实例化后的对象,分配的内存可以动态变化。因此,我们可以修改一个可变字符串的内容,或者在一个可变数组中新增/删除其中的对象。

3、容器类与非容器类

容器类就是该类的对象可以用来容纳其他对象,最典型的是数组NSArray以及NSMutableArray。

非容器类的对象不能够容纳其他对象,例如,字符串。

4、非容器类且不可变对象的拷贝

结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制

示例代码:

void copyTest1 () {
    NSLog(@"非容器类不可变对象复制");
    
    NSString *string = @"九九学院";
    
    NSString *string1 = [string copy];
    
    NSString *string2 = [string mutableCopy];
    
    NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSString class], string, string1, string2);
    
    NSLog(@"结论:非容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制");
}

运行结果:

5、非容器类且可变对象的拷贝

结论:非容器类可变对象:copy->深复制, mutableCopy->深复制

示例代码:

/**
 *  非容器类可变对象复制
 */
void copyTest2 () {
    NSLog(@"非容器类可变对象");
    
    NSMutableString *string = [NSMutableString stringWithFormat:@"九九学院"];
    
    NSMutableString *string1 = [string copy];
    
    NSMutableString *string2 = [string mutableCopy];
    
    NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】",[NSMutableString class], string, string1, string2);
    
    NSLog(@"结论:非容器类可变对象:copy->深复制, mutableCopy->深复制");
    
}

运行结果:

6、容器类且不可变对象的拷贝

结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制

示例代码:

/**
 *  容器类不可变对象复制
 */
void copyTest3 () {
    NSLog(@"容器类不可变对象复制");
    
    NSString *string = @"九九学院";
    
    NSArray *array = [NSArray arrayWithObjects:string, nil];
    
    NSArray *array1 = [array copy];
    
    NSArray *array2 = [array mutableCopy];
    
    NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】", [NSArray class], array, array1, array2);
    NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p", string, array[0], array1[0],array2[0]);
    
    NSLog(@"结论:容器类不可变对象:copy->浅复制(指针复制), mutableCopy->深复制, 容器内的对象->浅复制");
}

运行结果:

7、容器类且可变对象的拷贝

结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制

示例代码:

/**
 *  容器类可变对象复制
 */
void copyTest4 () {
    NSLog(@"容器类可变对象复制");
    
    NSMutableString *string = [NSMutableString stringWithFormat:@"九九学院"];
    
    NSMutableArray *array = [NSMutableArray arrayWithObjects:string, nil];
    
    NSMutableArray *array1 = [array copy];
    
    NSMutableArray *array2 = [array mutableCopy];
    
    NSLog(@"Object Class: 【%@】 Origal Object 【%p】, copy Object: 【%p】, mutableCopy Object: 【%p】", [NSMutableArray class], array, array1, array2);
    NSLog(@"string :%p, array[0]: %p, array1[0]: %p, array2[0]: %p", string, array[0], array1[0],array2[0]);
    
    NSLog(@"结论:容器类可变对象:copy->深复制, mutableCopy->深复制, 容器内的对象->浅复制");
}

运行结果:

示例代码

https://github.com/99ios/6.1.2