AFNetworking 知识点1--NSCopying NSMutableCopying

1.NSCopying ————> - (id)copy; 
NSCopying是一个与对象拷贝有关的协议。如果想让一个类的对象支持拷贝,就需要让该类实现NSCopying协议。
 
NSCopying协议中的声明的方法只有一个- (id)copyWithZone:(NSZone *)zone。
当我们的类实现了NSCopying协议,通过类的对象调用copy方法时,copy方法就会去调用我们实现的- (id)copyWithZone:(NSZone *)zone方法,实现拷贝功能。
 
- (id)copyWithZone:(NSZone *)zone{ 
PersonModel *model = [[[self class] allocWithZone:zone] init]; 
model.firstName = self.firstName; 
model.lastName = self.lastName; 
//未公开的成员 model->_nickName = _nickName; return model; 
}
 
说明:在- (id)copyWithZone:(NSZone *)zone方法中,一定要通过[self class]方法返回的对象调用allocWithZone:方法。
因为指针可能实际指向的是PersonModel的子类。这种情况下,通过调用[self class],就可以返回正确的类的类型对象。
 
  1. //无子类是可以这样实现  
  2.    Fraction *newFract = [[Fraction allocWithZone:zone] init];  
  1. //有子类时,需要这样实现  
  2.     Fraction *newFract = [[[self class] allocWithZone:zone] init]; 
 
 
举例:

 
例如:
 B = A.copy.
对对象进行copy操作,会得到一个新的对象,但是其属性,其指针跟之前是同一个地址。 
A属性值改变时,同一个地址B的值也会改变。 
A属性地址如果变了,B的值不会受到影响。B还是指向原先的地址。
 
注意: NSString , NSArray,NSDictionary,NSSet 进行copy 不会产生新的对象。 
 
2.NSMutableCopying - (id)mutableCopy;
NSCopying协议与NSMutableCopying的区别主要是在于,返回的对象是否是可变类型的。以Foundation框架的NSArray为例
 
NSArray *nameArray = @[@"Jim", @"Tom", @"David"]; 
NSArray *copyArray = [nameArray copy]; 
NSMutableArray *mutableCopyArray = [nameArray mutableCopy];
 [mutableCopyArray addObject:@"Sam”]
 
NSArray对象调用copy方法时,copy方法会调用- (id)copyWithZone:(NSZone *)zone,得到对象的一份拷贝,但得到的对象还是不可变的对象。而NSArray对象调用mutableCopy方法时,mutableCopy方法会调用- (id)mutableCopyWithZone:(NSZone *)zone,得到可变的对象。
所以,如果自定义类具有可变和不可变的区别,想让它支持拷贝时,就需要同时实现NSCopying和NSMutableCopying,在- (id)copyWithZone:(NSZone *)zone返回的是不可变对象,在- (id)mutableCopyWithZone:(NSZone *)zone返回的是可变对象。
 
@property (nonatomic, copy) NSString *string;
 
对于NSString , NSArray,NSDictionary ,要使用copy关键字。 
因为其子类存在mutable 版本,使用strong,指向的是同一个地址,其值如果改动,都会改动。 
举例:
@property (nonatomic, strong) NSString *string;
 
NSMutableString *string = [NSMutableString stringWithString:@"哇"];
    self.string = string;
    [string appendString:@"哈哈"];
   
    NSLog(@"%@",self.string);
 
 
浅拷贝和深拷贝
 
深拷贝:在拷贝对象自身时,将其底层数据也一并复制过去
Foundation框架中的所有collection类在默认情况下都执行浅拷贝,也就是说,只拷贝容器对象本身,而不复制其中数据。
 
浅拷贝之后的内容和原始内容均指向相同对象。
而深拷贝之后的内容所指的对象是原始内容中相关对象的一份拷贝。 
 
 
 
 
想要实现深拷贝,像数组,字典,集合 要实现下面这些方法。 
 
 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/JShuo/p/8678222.html

你可能感兴趣的:(AFNetworking 知识点1--NSCopying NSMutableCopying)