copy的意思是复制
iOS 中提供了两种复制的方法
copy和mutableCopy
那么这两个家伙的区别究竟是什么,接下来介绍一下
在main.m里写入如下代码
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableString * string = [NSMutableString string];
[string appendString:@"1"];
[string appendString:@"2"];
NSLog(@"string->%p [string copy]->%p [string mutableCopy]->%p",string,[string copy],[string mutableCopy]);
NSLog(@"%@ %@ %@",string,[string copy],[string mutableCopy]);
}
return 0;
}
运行结果
可以看到三个字符串有相同的结果,但地址不同
说明两种方法确实都复制生成了新的对象
但copy出来的对象是不可变字符串
mutableCopy出来的对象是可变字符串
如果你写成
NSMutableString *str1= [string copy];
[str1 appendString:@“456”];
这样是错的,你运行会崩溃,不可变字符串后面不能拼接家伙
NSMutableString类型的字符串是可变字符串,它后面可以拼接字符串
它可以这样写
NSMutableString *str2 = [string mutableCopy];
[str2 appendString:@"123"];
再看一段代码
NSString *string = @"12";
NSString *str1 = [string copy]; // 没有产生新对象
NSMutableString *str2 = [string mutableCopy]; // 产生新对象
NSLog(@"string->%p str1->%p str2->%p",string,str1,str2);
运行结果
可以看出string的地址和str1的地址相同,和str2的地址不同
那么得出结论
- copy出来的副本并不是新的对象,mutableCopy出来的副本是新对象
string本身就是个不可变字符串,所以苹果规定copy出来家伙不再生成新的内存,只是拷贝了指向同一块内存的指针
而matableCopy把原对象的内容拷贝了过来,生成了一块新的内存
总结一下就是
- copy 是指针拷贝 也就是浅拷贝
- mutableCopy 是内容拷贝 也就是深拷贝
•来一张表
源对象类型 | 拷贝方法 | 副本对象类型 | 是否产生了新对象 | 拷贝类型 |
---|---|---|---|---|
NSString | copy | NSString | NO | 浅拷贝(指针拷贝) |
NSString | mutableCopy | NSMutableString | YES | 深拷贝(内容拷贝) |
NSMutableString | copy | NString | YES | 深拷贝(内容拷贝) |
NSMutableString | mutableCopy | NSMutableString | YES | 深拷贝(内容拷贝) |
NSArray | copy | NSArray | NO | 浅拷贝(指针拷贝) |
NSArray | mutableCopy | NSMutableArray | YES | 深拷贝(内容拷贝) |
NSMutableArray | copy | NSArray | YES | 深拷贝(内容拷贝) |
NSMutableArray | mutableCopy | NSMutableArray | YES | 深拷贝(内容拷贝) |
NS* | copy | NS* | NO | 浅拷贝(指针拷贝) |
NS* | mutableCopy | NSMutable* | YES | 深拷贝(内容拷贝) |
NSMutable* | copy | NS* | YES | 深拷贝(内容拷贝) |
NSMutable* | mutableCopy | NSMutable* | YES | 深拷贝(内容拷贝) |