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深拷贝,浅拷贝,拷贝自定义对象的简单介绍

copy语法的目的:改变副本的时候,不会影响到源对象; 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。 拷贝有下面...

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

转自:http://blog.csdn.net/daiyelang/article/details/18730303 copy语法的目的:改变副本的时候,不会影响到源对象; ...
  • crs258
  • crs258
  • 2015年09月17日 16:53
  • 210

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

copy语法的目的:改变副本的时候,不会影响到源对象; 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。 ...

JavaScript对象的浅拷贝和深拷贝简单实现

浅拷贝我们知道浅拷贝时,如果是拷贝基本类型的变量时没问题,当拷贝非基本类型的变量时,实际上拷贝的是原对象的地址,他们指向的对象是堆中的同一个对象 var a = { key1:"...

iOS中复制对象的用法及深拷贝和浅拷贝详解

http://www.2cto.com/kf/201405/302273.html 第一、复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象。 第二、如果...
  • jeffasd
  • jeffasd
  • 2016年05月15日 22:26
  • 168

IOS中复制对象的用法及深拷贝和浅拷贝详解

第一、复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象。 第二、如果一个对象想具备复制的功能,必须实现协议和协议 NSObject自带的常用的对象有:NSNum...

IOS中复制对象的用法及深拷贝和浅拷贝详解

第一、复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象。 第二、如果一个对象想具备复制的功能,必须实现协议和协议 NSObject自带的常用的对象有:NSNum...

IOS中复制对象的用法及深拷贝和浅拷贝详解

第一、复制对象的基本概念 复制一个对象为副本,开辟一块新的内存来存储副本对象。 第二、如果一个对象想具备复制的功能,必须实现协议和协议 NSObject自带的常用的对象有:NSNumber、NS...

iOS自定义对象的拷贝

自定义对象的拷贝//分析: NSString可直接进行拷贝 [str copy]; NSString *str = @"hello"; NSString *str1 = [str cop...

iOS 对象数组的深拷贝(NSCoding协议)

项目过程中遇到了对象数组的使用:联系人界面——需要分区显示,如果我存放在一个数组然后每次显示都重新分组发现会有一个计算的延迟,所有我先进行分区放在了一个单例类中的字典中。当我需要用到这个联系人的界面额...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍
举报原因:
原因补充:

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