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

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的博客–对象复制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值