iOS OC NSCopying 协议
2015-07-11 00:00
501 查看
摘要: 若想令自己所写的对象具有拷贝功能,需要实现NSCopying 协议
zone是之前开发程序程序时,会把内存分成不同的 zone ,而对象会创建在zone 中。现在不用了,每个程序只有一个区-默认区(default zone),不用考虑zone参数
copy方法由NSObject实现,该方法只是以 默认区 为参数来调用 copyWithZone: 我们总是想覆写copy方法,其实真正需要实现的却是 copyWithZone: 方法,这是需要注意的地方。若想使某个类支持拷贝功能,声明该类遵从NSCopying协议,并实现其中的方法即可。
类分为可变版本与不可变版本,那么就应该实现NSMutableCopying,若采用此模式,则在可变类中覆盖 copyWithZone 方法时,不要返回可变的拷贝,而应该返回不可变的版本。无论当前实例是否可变,若需要获取可变版本的拷贝,都应该调用mutableCopy方法,若需要不可变的拷贝,则通过copy方法来获取
EOCCopying.m
main.m
如果自定义的对象分为不可变版本与可变版本,那么就要同时是此案NSCopying 与NSMutableCopying协议
复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝
如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法
一 NSCopying 协议
想让自己的类支持拷贝操作(copy),就需要实现NSCopying协议,该协议中有个方法:-(id)copyWithZone:(NSZone *)zone
zone是之前开发程序程序时,会把内存分成不同的 zone ,而对象会创建在zone 中。现在不用了,每个程序只有一个区-默认区(default zone),不用考虑zone参数
copy方法由NSObject实现,该方法只是以 默认区 为参数来调用 copyWithZone: 我们总是想覆写copy方法,其实真正需要实现的却是 copyWithZone: 方法,这是需要注意的地方。若想使某个类支持拷贝功能,声明该类遵从NSCopying协议,并实现其中的方法即可。
类分为可变版本与不可变版本,那么就应该实现NSMutableCopying,若采用此模式,则在可变类中覆盖 copyWithZone 方法时,不要返回可变的拷贝,而应该返回不可变的版本。无论当前实例是否可变,若需要获取可变版本的拷贝,都应该调用mutableCopy方法,若需要不可变的拷贝,则通过copy方法来获取
二 代码
EOCCopying.h==EOCCopying.h #import <Foundation/Foundation.h> @interface EOCCopying : NSObject<NSCopying> /*name*/ @property (nonatomic, copy ) NSString *name; /*mutable array*/ @property (nonatomic, copy ) NSMutableArray *array; -initWithName:(NSString *)name; //深拷贝 -(id)deepCopy; @end
EOCCopying.m
// // EOCCopying.m // EOC // // #import "EOCCopying.h" @implementation EOCCopying -(id)initWithName:(NSString *)name { self = [super init]; if (self) { _name = name; _array = [NSMutableArray new]; } return self; } -(id)copyWithZone:(NSZone *)zone { EOCCopying *copy = [[[self class] allocWithZone:zone] initWithName:_name]; // copy.array = [_array mutableCopy]; // copy.array = [_array copy]; //深拷贝 copy->_array = [[NSMutableArray alloc]initWithArray:_array copyItems:YES]; return self; } -(id)deepCopy { EOCCopying *copy = [[[self class] alloc] initWithName:_name]; //深拷贝 copy->_array = [[NSMutableArray alloc]initWithArray:_array copyItems:YES]; return self; } @end
main.m
// // main.m // EOC // // #import <Foundation/Foundation.h> #import "EOCCopying.h" int main(int argc, const char * argv[]) { @autoreleasepool { EOCCopying *obj = [[EOCCopying alloc]initWithName:@"COPY ---"]; EOCCopying *cop = [obj deepCopy]; NSLog(@"obj.name=%@",obj.name); NSLog(@"cop.name=%@",cop.name); [obj.array addObject:@"1"]; NSLog(@"obj.array[0]=%@",obj.array[0]); obj.array[0] = @"一"; NSLog(@"cop.array[0]=%@",cop.array[0]); NSLog(@"obj.array[0]=%@",obj.array[0]); [cop.array addObject:@"2"]; NSLog(@"cop.array[1]=%@",cop.array[1]); NSLog(@"obj.array[1]=%@",obj.array[1]); obj.name = @"xx"; NSLog(@"obj.name=%@",obj.name); NSLog(@"cop.name=%@",cop.name); } return 0; }
三 总结
若想令自己所写的对象具有拷贝功能,需要实现NSCopying 协议如果自定义的对象分为不可变版本与可变版本,那么就要同时是此案NSCopying 与NSMutableCopying协议
复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝
如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- ios中图像进行压缩方法汇总
- IOS检测指定路径的文件是否存在
- iOS、Mac OS X系统中编程实现汉字转拼音的方法(超级简单)