OC之复制

来源:互联网 发布:c语言函数指针 编辑:程序博客网 时间:2024/05/06 19:21

一、概念与关键字

    1.复制概念

对象的复制就是复制一个对象作为副本,他会开辟一块新的内存(堆内存)来存储副本对象,就像复制文件一样,即源对象和副本对象是两块不同的内存区域。对象要具备复制功能,必须实现<NSCopying>协议或者<NSMutableCopying>协议,常用的可复制对象有:NSNumber、NSString、NSMutableString、NSArray、NSMutableArray、NSDictionary、NSMutableDictionary

浅层复制:复制引用对象的指针。

深层复制:复制引用对象内容。

    2.关键字

retain:始终是浅复制。仅仅是指针引用,引用计数每次加一。返回对象是否可变与被复制的对象保持一致。

copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,

           引用计数每次加一。始终返回一个不可变对象。

mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

    3.对象的变化

不可变对象:值发生改变,其内存首地址随之改变。

可变对象:无论值是否改变,其内存首地址都不随之改变。

引用计数:为了让使用者清楚的知道,该对象有多少个拥有者(即有多少个指针指向同一内存地址)


  
 二、常见的复制

    

    1.不可变对象→可变对象的转换:

NSArray *array1 = [NSArray arrayWithObjects:@"a", @"b", @"c", @"d", nil];NSMutableArray *array2 = [array1 mutableCopy];

    2.可变对象→不可变对象的转换:

NSMutableArray *array2 = [NSMutableArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];NSArray *array1 = [array2 Copy];

    3.可变对象→可变对象的转换(不同指针变量指向不同的内存地址):

NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];NSMutableArray *array2 = [array1 mutableCopy];

        通过上边的两个例子,我们可轻松的将一个对象在可变和不可变之间转换,并且这里不用考虑内存使用原则(即引用计数的问题)

    4.同类型对象之间的指针复制(不同指针变量指向同一块内存地址): 

1>字符串的复制

NSMutableString *str1 = [NSMutableString stringWithString:@"two day"];NSMutableString *str2 = [str1 retain];[str1 release];

2>不可变数组的复制

NSArray *array1 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];NSArray *array2 = [array1 Copy];[array1 release];


三、总结

什么时候用到深浅拷贝?

深拷贝是在要将一个对象从可变(不可变)转为不可变(可变)或者将一个对象内容克隆一份时用到;

浅拷贝是在要复制一个对象的指针时用到


0 0
原创粉丝点击