ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍

转载 2016年05月30日 18:34:52

copy语法的目的:改变副本的时候,不会影响到源对象;

深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。

浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。

拷贝有下面两个方法实现拷贝:

- (id)copy;  
- (id)mutableCopy;

要实现copy,必须实现协议
数组,字典,字符串都已经实现了协议,以下以字符串为例,其他的同理:
1.不可变字符串调用copy实现拷(浅拷贝)

NSString *string = [[NSString alloc] initWithFormat:@"abcde"];  
// copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身  
// 源对象计数器会+1  
// 在浅拷贝情况下,copy其实就相当于retain  
NSString *str = [string copy];  

2.不可变字符串调用mutableCopy实现拷贝,(深拷贝)

NSString *string = [[NSString alloc] initWithFormat:@"abcd"];  
// 产生了一个新的对象,计数器为1。源对象的计数器不变。  
NSMutableString *str = [string mutableCopy];//此时存在两个对象// str:1和// string:1  
 // str和string不是相同对象  
 // NSLog(@"%i", str == string);//0  
 [str appendString:@" abcd"];//修改str不影响string  
 NSLog(@"string:%@", string);  
 NSLog(@"str:%@", str);  

3.可变字符串调用copy实现拷贝(深拷贝)

NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];  
 // 会产生一个新对象,str计数器为1  
 NSString *str = [string copy]; 

4.可变字符串的MutableCopy(深拷贝)

NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];  
// 会产生一个新对象,str计数器为1  
NSMutableString *str = [string mutableCopy];  
[str appendString:@"1234"];//修改新对象不影响原对象  
NSLog(@"str:%@", str);  
NSLog(@"string:%@", string);  

5.拷贝自定义对象,下面以Student对象为例

a.Student要实现copy,必须实现协议
b.实现协议的方法:

  • (id)copyWithZone:(NSZone *)zone

Student.h文件

@interface Student : NSObject <NSCopying>  

// copy代表set方法会release旧对象、copy新对象  
// 修改外面的变量,并不会影响到内部的成员变量  
// 建议:NSString一般用copy策略,其他对象一般用retain  
@property (nonatomic, copy) NSString *name;  

+ (id)studentWithName:(NSString *)name;  

@end  

Student.m文件

#import "Student.h"  

@implementation Student  

+ (id)studentWithName:(NSString *)name {  
    // 这里最好写[self class]  
    Student *stu = [[[[self class] alloc] init] autorelease];  
    stu.name = name;  

    return stu;  
}  

- (void)dealloc {  
    [_name release];  

    [super dealloc];  
}  

#pragma mark description方法内部不能打印self,不然会造成死循环  
- (NSString *)description {  
    return [NSString stringWithFormat:@"[name=%@]", _name];  
}  

#pragma mark copying协议的方法  
// 这里创建的副本对象不要求释放  
- (id)copyWithZone:(NSZone *)zone {  
    Student *copy = [[[self class] allocWithZone:zone] init];  

    // 拷贝名字给副本对象  
    copy.name = self.name;  

    return copy;  
}  

@end  

拷贝Student

Student *stu1 = [Student studentWithName:@"stu1"];  

Student *stu2 = [stu1 copy];  
stu2.name = @"stu2";  

NSLog(@"stu1:%@", stu1);  
NSLog(@"stu2:%@", stu2);  

[stu2 release];  

小结:
建议:NSString一般用copy策略,其他对象一般用retain;

只有一种情况是浅拷贝:不可变对象调用copy方法时,其他情况都为深拷贝;

【iOS】自定义对象深拷贝、浅拷贝

问题情境 其实这是学习ios第二天,看了斯坦福大学的2013年秋季iOS公开课,做了一个纸牌匹配小游戏。其中遇到的问题不少,关于object-c的学习就不再赘述,其中的一个问题我觉得在这里记一笔,对今...
  • yzt33
  • yzt33
  • 2015-05-20 21:28:32
  • 1867

深拷贝,浅拷贝,自定义的类的对象实现拷贝

对于深拷贝,浅拷贝,以及自定义的类的对象进行拷贝的总结 浅拷贝:不会产生新的对象,产生一个指针指向原来的对象的地址,也叫地址拷贝或者指针拷贝, 深拷贝:产生新的对象,有自己的内存地址,复制的是内容,对...
  • li15809284891
  • li15809284891
  • 2016-09-06 18:26:16
  • 925

iOS开发——深拷贝与浅拷贝详解

深拷贝和浅拷贝这个问题在面试中常常被问到,而在实际开发中,只要稍有不慎,就会在这里出现问题。尤其对于初学者来说,我们有必要来好好研究下这个概念。我会以实际代码来演示,相关示例代码上传至 这里 。   ...
  • CHENYUFENG1991
  • CHENYUFENG1991
  • 2016-06-28 01:41:07
  • 9337

iOS开发-数组的深拷贝浅拷贝注意点

今天写代码过程中遇到一个头疼的问题:可变数组经过深拷贝之后,变动新数组里面的元素,原来的数组也会跟着变。 做了一下实验,得到如下结论: 当数组元素是自定义类的时候,不管深浅拷贝,数组里面的元素地址...
  • gang544043963
  • gang544043963
  • 2016-07-20 16:07:43
  • 2846

OC中的字符串属性(深拷贝和浅拷贝)

我们在项目中定义一个字符串属性的时候,有时候见到别人用retain,有时候见到用copy。那么到底这两种用法有什么区别呢? 这就需要我们了解深拷贝和浅拷贝和区别了。 其实copy是创建一个新对象,...
  • qq_29892943
  • qq_29892943
  • 2016-03-05 14:08:10
  • 801

一看就懂的,java深拷贝浅拷贝

前言 这两天,男票兴奋地通知我,我的博客终于有排名了,刚好是20000名,原来都是千里之外。我也比较兴奋,在这里谢谢每一个看到我文章的同学。O(∩_∩)O哈哈~,为什么有一种颁奖典礼的赶脚。真的啦,...
  • XIAXIA__
  • XIAXIA__
  • 2014-12-01 21:56:31
  • 7769

OC之【深拷贝(mutableCopy)和浅拷贝(copy)】

main.m文件 #import #import "Student.h" #import "GoodStudent.h" // copy语法的目的:改...
  • superchaoxian
  • superchaoxian
  • 2013-12-01 20:58:06
  • 1753

OC数组中的深拷贝

浅拷贝与深拷贝首先回顾下,浅拷贝:即指针拷贝,源对象和新对象指向的是同一个地址,也就是说浅拷贝要复出出来一个新的文件,但两个文件的地址还是一个。浅拷贝的话是只有不可变数组(如:NSArray,NSSe...
  • lvye1221
  • lvye1221
  • 2016-05-11 09:30:10
  • 4148

Python拷贝对象(浅拷贝copy与深拷贝deepcopy)

先说一段废话。Python中的参数传递都是对象引用传递,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递...
  • zhangqi_gsts
  • zhangqi_gsts
  • 2016-10-22 00:17:04
  • 1088

c++深拷贝和浅拷贝

C++中类的拷贝有两种:深拷贝,浅拷贝当出现类的等号赋值时,会调用拷贝函数 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅...
  • u010700335
  • u010700335
  • 2014-10-06 19:27:49
  • 2219
收藏助手
不良信息举报
您举报文章:ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍
举报原因:
原因补充:

(最多只允许输入30个字)