《Objective-c》Foundation框架 -(copy/mutableCopy)
1.copy(不可变副本)/mutableCopy(可变副本):
-
copy语法的目的:改变副本的时候,不会影响到源对象;
-
一个对象可以使用copy/mutableCopy方法创建副本;
-
copy需要先实现NSCopying协议,创建的是不可变副本;
-
mutableCopy需要先实现NSMutableCopying协议,创建的时不可变副本;
-
深拷贝:内容(对象)的拷贝,源对象和副本指向的是不同的对象。源对象的引用计数器不变,新对象的引用计数器设置为1;
-
浅拷贝:指针的拷贝,源对象和副本指向的时同一个对象。对象的引用计数器+1;相当于做了一次retain操作;
-
只有不可变对象创建不可变副本(copy)才是前拷贝,其他的都是深拷贝;
-
NSString/NSMutableString、NSDictionary/NSMutableDictionary、NSArray/NSMutableArray等都已经实现了NSCopying协议和NSMutableCopying协议,所以在使用copy或者mutableCopy创建副本是不用再实现NSCopying协议或者NSMutableCopying协议
2.浅拷贝(指针拷贝):
-
浅拷贝:指针拷贝,不会产生新对象。源对象的计数器+1,相当于做了一次retain操作;
-
只有一种情况是浅拷贝,不可变对象调用对象方法时;
-
浅拷贝为指针的拷贝:
3.深拷贝(内容拷贝):
-
深拷贝:内容(对象)拷贝,会产生新对象。新对象的计数器置1,源对象的计数器不变;
-
深拷贝一:NSString NSMutableCopy
-
深拷贝二:NSMutableString copy
-
深拷贝三:NSMutableString NSMutableCopy
3.自定义类以及子类的拷贝:
-
自定义的类如果想使用copy或者mutableCopy必须要先实现NSCopying协议或者NSMutableCopying协议!不然会报错“[Student copyWithZone:]: unrecognized selector sent to instance 0x1030051a0”
-
NSCopying协议或者NSMutableCopying协议中都各有一个方法:所以我们应该重新实现其方法!
-
- (id)copyWithZone:(NSZone *)zone方法的重写:
-
由于子类中还有其他的属性(age),所以还要将age属性拷贝给副本,所以还要在子类中重写- (id)copyWithZone:(NSZone *)zone方法
-
使用静态方法快速创建对象时的注意点: