面试必考察的iOS基础原理--深复制,浅复制,过一段时间总是会混淆,写下demo帮助理清概念
不可变字符串:
NSString *str = @"testStr";
NSString *copyStr = [str copy];
NSString *mcopyStr = [str mutableCopy];
NSLog(@"不可变:%p-----copy: %p----mcopy: %p",str,copyStr,mcopyStr);
打印结果:
不可变:0x106d6a068-----copy: 0x106d6a068----mcopy: 0x60000038e6d0
可变字符串:
NSMutableString *mStr = [[NSMutableString alloc] initWithString:@"mutabTestStr"];
NSString *copyMstr1 = [mStr copy];
NSMutableString *copyMstr2 = [mStr copy];
NSMutableArray *mCopyMStr = [mStr mutableCopy];
// [copyMstr2 appendString:@"addStr"];
NSLog(@"可变:%p--copy1: %p--copy2: %p--mcopy: %p",mStr,copyMstr1,copyMstr2,mCopyMStr);
打印结果:
可变:
对于非集合类对象:
不可变对象进行copy是内存地址复制,没有产生新的对象,为浅拷贝;
不可变对象进行mutableCopy是内容复制,产生了新的对象,为深拷贝。
可变对象进行copy和mutableCopy都是内容复制,产生了新的对象,为深拷贝。
另外在执行[copyMstr2 appendString:@"addStr"];会导致Crash,原因是对象进行copy后都是不可变的对象。
网友评论