bruceyou1990-iOS学习日记-Objective-C深拷贝浅拷贝和NSCopying协议

版权声明:Coder Bruce https://blog.csdn.net/bruceyou1990/article/details/52852122

NSCopying

如果想令自己的类支持拷贝操作,那就要实现NSCopying协议。PS:类(比如对整一个model)的copy 为什么这样说呢 因为oc 中有些自带copy属性,比如NSstring是自带copy属性的。

1.使用场景
我们现在需要 A页面传到B页面
将A界面的Model对象“=”赋值给B界面Model属性(由copy修饰)。

B.h页面中定义到的属性 拿到这个mode

@property (nonatomic, copy) model *Model;

现在我们传model A —> B,并用“=”赋值:

A.m实现文件

- (void)test{
        PassModel *model = [[PassModel alloc] init];
        model.name = @"bruceyou1990";
        Bvc *b=[[Bvc alloc]init];
        b.passModel = model;
    }
}

这时候会报错

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[model copyWithZone:]: unrecognized selector sent to instance 0x14d64abb0'

这时候就该nscopying上场
2.怎么支持NSCopying
2.1. Foundation类已经遵守了和 协议,即实现了
2.2 重写- (id)copyWithZone:(NSZone *)zone;
这样就可了

model.m

#import "model.h"
@implementation model
- (instancetype)initWithName:(NSString *)name age:(int)age
{
    self = [super init];
    if (self) {
       self.name = name;
        self.age = age;
        _friends = [NSMutableArray array];
    }
    return self;
}
- (id)copyWithZone:(NSZone *)zone{
    model *p = [[[self class] allocWithZone:zone] initWithName:_name age:_age];
    return p;
}
@end

补充model.h

@interface model : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,readonly) NSArray *friends;
@property (nonatomic,assign) int age;
- (instancetype)initWithName:(NSString *)name age:(int)age;
@end

深拷贝和浅拷贝

复制对象时应该决定是深拷贝还是浅拷贝,一般情况下是浅拷贝,如果你所写的对象需要深拷贝,那么需要新增一个专门执行深拷贝的方法

深拷贝:内容拷贝(对象中的每一个变量都进行了拷贝),创建了新的对象,新对象引用计数为1,原对象引用计数不变。
浅拷贝:指针拷贝,没有创建新对象,原对象引用计数增加1。NSCopying 默认是浅拷贝

参考

CSDN博主wxxu– ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍
Ives的博客–对象复制

猜你喜欢

转载自blog.csdn.net/bruceyou1990/article/details/52852122