iOS自定义对象的拷贝

来源:互联网 发布:淘宝美工多久能学会 编辑:程序博客网 时间:2024/04/30 12:58

自定义对象的拷贝

//分析: 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;}
0 0