浅拷贝:指针(地址)拷贝,不会产生新对象
深拷贝:内容拷贝,会产生新对象
非容器类对象的深拷贝、浅拷贝
非容器类对象:NSString,NSNumber这些不能包含其他对象的叫做非容器类
NSString(不可变字符串)
NSString *string1 = @"helloworld";
NSString *string2 = [string1 copy]; // 浅拷贝
NSString *string3 = [string1 mutableCopy]; // 深拷贝
浅拷贝类似retain,引用计数对象+1.创建一个指针;属性表示两个对象地址相同(建立一个指针,指针拷贝)
深拷贝是真正意义上的拷贝,是创建一个新对象。copy属性表示两个对象内容相同,新的对象retain为1,与原对象的引用计数无关,原对象没有改变。
总结: 因为都是不可变字符串,创建方式并不影响拷贝方式。所以可以得出结论,对于字符串这类非容器类对象,copy是浅拷贝,mutable是深拷贝。
NSMutableString(可变字符串)
// 如果是一个MutableString,那么无论是copy,mutableCopy,都会创建一个新对象。
NSMutableString *string1 = [NSMutableString stringWithString:@"helloworld"];
NSString *string2 = [string1 copy]; // 深拷贝
NSString *string3 = [string1 mutableCopy]; // 深拷贝
总结:对于MutableString,右侧无论是copy还是mutableCopy,都会创建一个新对象,都是属于深拷贝。
可变字符串拷贝后 是否是 可变字符串呢
// 如果是一个MutableString,那么无论是copy,mutableCopy,都会创建一个新对象。
NSMutableString *string1 = [NSMutableString stringWithString:@"helloworld"];
NSString *string2 = [string1 copy]; // 深拷贝
NSString *string3 = [string1 mutableCopy]; // 深拷贝
NSMutableString *string4 = [string1 copy]; // 深拷贝
NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝
// 增加以下代码
[string4 appendString:@"MMMMMM"];
[string5 appendString:@"11111"];
运行代码后,会在[string4 apendString:@“MMMMM”];这一行出现崩溃
总结:1. 对于可变对象的复制,都是深拷贝;
2. 可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。
容器类对象的深拷贝、浅拷贝
容器类对象:Array,diction这些能包含其他对象的叫做容器类
NSArray *array01 = [NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];
NSArray *copyArray01 = [array01 copy];
NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];
- copyArray01和array01指向的是同一个对象,包括里面的元素也是指向相同的指针。
- mutableCopyArray01和array01指向的是不同的对象,但是里面的元素指向相同的对象,mutableCopyArray01可以修改自己的对象。
- copyArray01是对array01的指针复制(浅复制),而mutableCopyArray01是内容复制。
上面的是不可变容器NSArray,这里测试下可变容器NSMutableArray:
NSMutableArray *array01 = [NSMutableArray arrayWithObjects:@"a",@"b",@"c", nil nil];
NSArray *copyArray01 = [array01 copy];
NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];
总结:1. 容器对象和非容器对象类似,可变对象复制(copy,mutableCopy)的都是一个新对象;不可变对象copy是浅复制,mutableCopy是深复制。
- 对于容器而言,元素对象始终是指针复制。
网友评论