文档章节

iOS OC NSCopying 协议

卧龙小
 卧龙小
发布于 2015/07/11 15:25
字数 629
阅读 333
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一  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协议

  • 复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝

  • 如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法


© 著作权归作者所有

卧龙小
粉丝 42
博文 146
码字总数 70107
作品 0
西城
程序员
私信 提问
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
2018/08/31
0
0
Objective-C浅拷贝和深拷贝

浅拷贝 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如: char str = (char)malloc(100); char* str2 = str; 浅拷贝只是对对象的简单拷贝,让几个对象共用一片内...

大喵哥
2014/09/20
57
0
iOS WebView和JS的交互

前言 现在web前端发展越来越快,为了追求应用的快速开发和迭代,许多产品都会选择混合开发,在手机端嵌入web页面,那么这就会导致一个问题, 原生代码怎么和js交互?那么下边我们共同学习一下...

小猿_Luck_Boy
2018/05/17
0
0
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
一、Objective-C概述

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略...

长平狐
2013/03/28
163
0

没有更多内容

加载失败,请刷新页面

加载更多

用于电话号码验证的综合正则表达式

我正在尝试综合使用正则表达式来验证电话号码。 理想情况下,它将处理国际格式,但必须处理美国格式,包括以下内容: 1-234-567-8901 1-234-567-8901 x1234 1-234-567-8901 ext1234 1(234)...

javail
38分钟前
6
0
你为什么要使用表达 >而不是Func ?

我了解lambda和Func和Action代表。 但是表情让我难过。 在什么情况下,您将使用Expression<Func<T>>而不是普通的旧Func<T> ? #1楼 我想添加一些关于Func<T>和Expression<Func<T>>之间的区别......

技术盛宴
53分钟前
5
0
用最简单的方法实现原生JS放大镜特效

<html lang="en"><head> <meta charset="UTF-8"> <title>Document</title> <style> *{margin:0px;padding:0px;} #big{width:200p......

汤清丽
57分钟前
4
0
NIO 编程

1. NIO 比 传统 IO 有什么优点? 答:NIO 一个 线程 可以监听多个客户端,传统 客户端 -- 服务端模型中,一个线程监听一个客户端,导致线程消耗过多,一个线程要分配0.5M~1M内存。 2. NIO服务...

杨凯123
57分钟前
4
0
SpringBoot 系列教程自动配置选择生效

191214-SpringBoot 系列教程自动配置选择生效 写了这么久的 Spring 系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效;那么有没有反其道而行之的呢? 我们知道可以通过@Co...

小灰灰Blog
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部