您的位置:首页 > 移动开发 > Objective-C

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

2016-10-18 20:09 507 查看

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的博客–对象复制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: