代码:
// 1、浅拷贝
// NSString *str1=@"lalala";
// 这里不能写成上面的形式,因为"lalala"为字符串常量,系统不会收回,也不会对其作引用计数,即使我们对str1如何retain或release,得到的引用计数都是一个十分大的数字(maxIntValue)
NSString *str1=[NSString stringWithFormat:@"abc"];
// 使用stringWithFormat创建的NSString为变量,系统会进行引用计数
NSString *str2=[str1 copy];
NSLog(@"str1.retainCount = %tu,str2.retainCount = %tu",str1.retainCount,str2.retainCount);
// 2015-09-17 16:49:10.246 copy 与内存管理[3932:278152] str1.retainCount = 2,str2.retainCount = 2
// 输出结果是2,那是因为copy是浅拷贝,浅拷贝后str2和str1指针都指向同一个内存空间,并没有产生新的对象(这里相当于两个强指针指向该内存空间,引用计数为2)
// 2、深拷贝
NSString *str3=[NSString stringWithFormat:@"laolao"];
NSMutableString *str4=[str3 mutableCopy];
NSLog(@"str3.retainCount = %tu,str4.retainCount = %tu",str3.retainCount,str4.retainCount);
// 2015-09-17 17:03:49.495 copy 与内存管理[4044:284962] str3.retainCount = 1,str4.retainCount = 1
// 输出结果是1,这是因为mutableCopy是深拷贝,str3和str4指针指向不同的内存空间,产生了新的对象,也就是产生了新的内存空间,原来的空间和新开辟的空间各有一个强指针指向。所以说引用计数都为1