自定义对象的拷贝
//分析: NSString可直接进行拷贝 [str copy];
NSString *str = @"hello";
NSString *str1 = [str copy];
NSString *str2 = [str mutableCopy];
NSLog(@"str1 = %@,str2 = %@",str1,str2);
//自定义拷贝的执行顺序:
//调用copy-> copyWithZone
Person *xiaoQ = [[Person alloc] init];
xiaoQ.name = @"xiaoQiang";
xiaoQ.age = 18;
Person *xiaoM = [xiaoQ copy]; //自定义对象的拷贝
NSLog(@"xiaoQ = %@",xiaoQ);
NSLog(@"xiaoM = %@",xiaoM);
Person *xiaoB = [xiaoQ mutableCopy];
NSLog(@"xiaoB = %@",xiaoB);
//自定义对象拷贝崩溃:
//疑问:NSString与自定义对象都是调NSObject的方法,要报错的话NSString也要报错
//通过分析1:NSString遵守了NSCopying协议:从而可知,NSString中一定实现了协议中必须的方法:copyWithZone
//通过分析2:字符串调用copy方法,必定内部调用了copyWithZone,字符串中有这个copyWithZone的实现方法所以不会奔溃;
//通过分析3: 自定义对象调用copy方法,内部也调用了copyWithZone
//最后,自定义对象遵守NSCopying,实现copyWithZone,崩溃就解决了
//结论:以后系统会提供很多类似的协议接口:
//不用我们生成的部分:
//1. 系统定制协议: NSCopying
//2. 被代理者: NSObject
//需要我们做的事情:
//3: 代理者: 遵守协议,实现协议方法,(隐含设置代理)
// 遵守协议
@interface Person : NSObject<NSCopying,NSMutableCopying>
//实现协议方法
-(id)copyWithZone:(NSZone *)zone
{
NSLog(@"自定义对象拷贝");
//allocWithZone: 开辟zone大小的空间
Person *xiaoM = [Person allocWithZone:zone];
xiaoM.name = self.name;
xiaoM.age =self.age;
return xiaoM;
}
-(id)mutableCopyWithZone:(NSZone *)zone
{
NSLog(@"自定义对象的mutable拷贝");
Person *xiaoM = [Person allocWithZone:zone];
xiaoM.name = _name;
xiaoM.age = _age;
return xiaoM;
}