int main(int argc, const char * argv[]) {
@autoreleasepool {
//------------------不可变的对象-------------------
//创建一个字符串型a
NSString *a = @"abcdefg";
//浅拷贝a,只是引用了一下,打印出来地址是一样的
//这里如果把浅拷贝出来的a1的值改变了,源a是不会跟着变的,a1会自动生成一个新的对象,和a是不同的地址
NSString *a1 = [a copy];
//深拷贝a,直接克隆了一下,打印出来是不同的地址
NSString *a2 = [a mutableCopy];
//打印a,a1,a2的值,比较一下
NSLog(@"%@ %@ %@", a, a1, a2);
//打印a,a1,a2的地址,比较一下
NSLog(@"%p %p %p", a, a1, a2);
//------------------可变的对象---------------------
NSMutableString *b = [NSMutableString stringWithString:@"abcdefg"];
//对可变对象不论是浅拷贝还是深拷贝,都是直接克隆了对象出来,都是不同的地址
NSMutableString *b1 = [b copy];
NSMutableString *b2 = [b mutableCopy];
NSLog(@"%@ %@ %@", b, b1, b2);
NSLog(@"%p %p %p", b, b1, b2);
}
return 0;
}
对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝)。
如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
可以使用copy的类:
NSNumber,
NSString,
NSMutableString,
NSDictionary,
NSMutableDictionary,
NSArray,
NSMutableArray,
NSSet,
NSMutableSet
来源:oschina
链接:https://my.oschina.net/u/2660864/blog/653100