属性关键字:copy
copy的字面意思就是“复制”,它是产生一个副本的过程,再来看在iOS里,copy与mutableCopy都是NSObject里的方法,一个NSObject的对象要想使用这两个函数,那么类必须实现NSCopying协议或NSMutableCopying协议,并且是实现了一般来说我们用的很多系统里的容器类已经实现了这些方法。
copy到底是深拷贝还是浅拷贝?
答:我相信有的同学认为只要是使用copy关键字,那么肯定都是深拷贝,这样是很不严谨的,就比如上个例子,虽然使用了copy,但是指针地址是一样,那么它就应该是浅拷贝。
所以是否是深浅拷贝,是否创建新的对象,是由程序运行的环境所造成的,并不是一概而论。
深浅copy
浅copy:指针复制,不会创建一个新的对象。
深copy:内容复制,会创建一个新的对象。
关于 NSString 与 NSMutableString 的例子
NSString *Str = [[NSString alloc]init];
NSString *Str2 = [Str copy];
NSLog(@"Str : %p",Str); //Str : 0x102e5b468 (Str对象地址)
NSLog(@"Str2 : %p",Str2); //Str2 : 0x102e5b468 (Str2对象地址)
可以看出,对于不可变对象的 NSString 使用copy是浅拷贝,因为俩个对象地址相同,未开辟新的内存空间。
NSMutableString *mStr = [[NSMutableString alloc]init];
NSMutableString *mStr2 = [mStr copy];
NSLog(@"mStr : %p",mStr); // mStr : 0x60000145d620 (mStr对象地址)
NSLog(@"mStr2 : %p",mStr2); // mStr2 : 0x103e3e7c8 (mStr2对象地址)
而对于NSMutableString可以看出,对于可变对象的 NSMutableString 使用copy是深拷贝,因为俩个对象地址不同,开辟新的内存空间。
苹果为什么要这么设计?这么设计的优点是什么?(为什么NSString使用copy是浅拷贝,而NSMutableString是深拷贝)
答:因为NSString指的是一个不可变对象,所以如果使用copy的话也会复制一个不可变对象,但是这
时候其实复制的对象和原来的对象的内存地址是一样的,个人觉得这种设计方式是为了节省内存空间,
因为NSString指的是一个不可变对象,无论是copy前后的对象都是不可变的对象,所以新开铺内存空
间并没有什么意义,这也可以解释为什么 NSString * str1=@"a"; NSString *str2 =
[str1 copy]; str1 = @“b”,b 的内存地址会变得原因。
而NSMutableString,使用copy会新开辟内存空间的原因和上面想法,因为NSMutableString
是一个可变对象,本身设计出来就是为了灵活变化用的。