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的博客–对象复制
相关文章推荐
- ios学习路线—Objective-C(深浅拷贝)
- 【学习ios之路:Objective-C】深拷贝和浅拷贝
- bruceyou1990-iOS学习日记-分类(Category) 和 扩展(Extension)
- 2011斯坦福大学iOS应用开发教程学习笔记(第三课)Objective-C
- IOS 开发学习(1): 学习纲领以及Objective-C 基本语法学习
- IOS学习之二:Objective-C基础语法和关键字
- IOS学习三:Objective-C的扩展OOP,类别,内存管理等
- ios 深浅拷贝学习
- 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
- IOS之Objective-C学习笔记(六)
- ios 深浅拷贝学习
- ios 深浅拷贝学习
- ios深浅拷贝学习
- iOS开发中表视图搜索栏实现中的Objective-C 深浅拷贝问题
- iOS开发中表视图搜索栏实现中的Objective-C 深浅拷贝问题
- iOS学习笔记07—Objective-C 委托、非正式协议、正式协议
- ios 深浅拷贝学习
- [传智播客学习日记]序列化、XML序列化与深拷贝操作
- IOS之Objective-C学习笔记(二)
- 【iOS知识学习】_objective-c 十进制转换成16进制