OC —— 拷贝

一、什么是拷贝

在 OC 中,可以使用两个方法分别对一个 OC 对象进行拷贝(产生副本),这两个方法是

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

如果想使用 copy 方法,那么该类必须遵守 <NSCopying> 协议

如果想使用 mutableCopy 方法,那么该类必须遵守 <NSMutableCopying> 协议

在看它们的区别之前,我们先来解释一下拷贝的分类

拷贝的分类

  1)浅拷贝 : 即指针拷贝,简单的说就是拷贝指针,不会产生新的对象,原对象的 引用计数 +1

  2)深拷贝 : 会产生一个新的对象,原对象的引用计数不变,新对象的引用计数为 1

注意 : 只有不可变对象(NSString、NSArray、NSDictionary等)调用 copy 方法才是浅拷贝,其余都是深拷贝

copy 和 mutableCopy 方法的区别

  1)copy : 创建的是一个不可变对象(NSString、NSArray、NSDictionary)

  2)mutableCopy : 创建的是一个可变的对象 (NSMutableString、NSMutableArray、NSMutableDictionary)

二、拷贝示例

1)不可变对象调用 copy

 1 void test_2() {
 2
 3     // 引用计数 : 1
 4     NSString * str_1 = [[NSString alloc] initWithFormat:@"age is %i", 10];
 5
 6     // copy 语法并没有产生一个新的对象,而是指向原来的对象
 7     // 引用计数 : 2
 8     NSString * str_2 = [str_1 copy];
 9
10     NSLog(@"str_1 --- %p", str_1);
11     NSLog(@"str_2 --- %p", str_2);
12
13     [str_1 release];
14
15     [str_1 release];
16
17
18 }

运行结果

总结 : 可见,不可变对象调用 copy 方法不会产生新的对象,如图

2)可变对象调用 copy

 1 void test_3() {
 2
 3     NSMutableString * mulString = [NSMutableString stringWithFormat:@"age is %i", 10];
 4
 5     // 可变对象调用 copy 是深拷贝
 6     NSString * str = [mulString copy];
 7
 8     NSLog(@"mulString --- %p", mulString);
 9     NSLog(@"str --- %p", str);
10
11     [mulString release];
12
13     [str release];
14
15 }

运行结果

总结 : 可变对象调用 copy 是深拷贝,会产生新的对象,如图

3)不可变对象调用 mutableCopy

 1 void test_1() {
 2
 3     // 引用计数 : 1
 4     NSString * str = [[NSString alloc] initWithFormat:@"age is %i", 10];
 5
 6     // 产生一个新的对象
 7     // 引用计数 : 1
 8     NSMutableString * mulStr = [str mutableCopy];
 9
10     NSLog(@"str --- %p", str);
11     NSLog(@"mulStr - %p", mulStr);
12
13     [str release];
14
15     [mulStr release];
16
17 }

运行结果

总结 : 不可变对象调用 mutableCopy 会产生一个新的对象,如图

4)可变对象调用 mutableCopy

 1 void test_4 () {
 2
 3     // 引用计数 1
 4     NSMutableString * mulString = [[NSMutableString alloc] initWithFormat:@"age is %i", 10];
 5
 6     // 可变对象调用 mutableCopy 产生新的对象
 7     // 引用计数 1
 8     NSMutableString * mulString_2 = [mulString mutableCopy];
 9
10     NSLog(@"mulString --- %p", mulString);
11     NSLog(@"mulString_2 --- %p", mulString_2);
12
13     [mulString release];
14
15     [mulString_2 release];
16
17 }

运行结果

总结 : 可变对象调用 mutableCopy 会产生一个新的对象,如图

时间: 2024-11-08 09:19:26

OC —— 拷贝的相关文章

详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy

读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的每一层复制都是指针复制. 深 复 制:在复制操作时,对于被复制的对象至少有一层复制是对象复制. 完全复制:在复制操作时,对于被复制的对象的每一层复制都是对象复制. 注:1.在复制操作时,对于对象有n层是对象复制,我们可称作n级深复制,此处n应大于等于1. 2.对于完全复制如何实现(目前通用的办法是:

Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对NSString对象做深拷贝时,如果是copy复制方式,其实就是浅复制,只是复制了同一个对象的指针:如果是mutableCopy复制方式,系统会分配一个新的内存空间用来存放复制出来的NSMutableString对象,此时地址是新的,内容是一样的,他们正在被不同的实例变量字符串指针指着. 可变对象:

OC学习篇之---对象的拷贝

在前一篇文章中我们说到了如何解决对象的循环引用问题:http://blog.csdn.net/jiangwei0910410003/article/details/41926369,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议: <NSCopyin

OC中对象拷贝概念

OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议:<NSCopying>.<NSMutableCopying>从名字上我们可以看到,一个协议是用于不可变对象的,一个协议适用于可变对象的 首先来介绍一下对象的拷贝的概念吧:为什么要由对象的拷贝这么一个概念呢?看一个场

(转载)OC学习篇之---对象的拷贝

在前一篇文章中我们说到了如何解决对象的循环引用问题,这一篇文章我们就来介绍一下OC中的对象拷贝概念,这个对于面向对象语言中都会有这种的问题,只是不同的语言有不同的解决方式:C++中有拷贝构造函数,Java中需要实现Cloneable接口,在clone方法中进行操作.但是不过OC更偏向于Java这种方式,OC中如果一个对象需要被拷贝,他需要实现协议: <NSCopying>.<NSMutableCopying> 从名字上我们可以看到,一个协议是用于不可变对象的,一个协议适用于可变对象

【OC学习-26】对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝

对象的拷贝分为浅拷贝和深拷贝,浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址,深拷贝则相当于不仅拷贝了一个对象还拷贝了它的属性,即完全是两个东西,只不过内容相同而已. 拷贝用到协议,如果这个类创建对象后,这个对象要被拷贝,那么这个类就需要用到拷贝协议,分两种:<NSCopying>和<NSMutableCopying>相当于一个是拷贝,另一个是拷贝后可修改. (1)浅拷贝的案例.有一个Person类,它创建一个person1对象后,用

iOS开发——面试篇&amp;OC基本语法总结(面试)

OC基本语法总结(面试) C和OC对比 OC中主要开发在什么平台上的应用程序? 答:可以使用OC开发Mac OS X平台和iOS平台的应用程序 OC中新增关键字大部分是以什么开头? 答:OC中新增关键字大部分是以@开头 OC中新增加了那些数据类型? 答: Block类型 指针类型(Class, id类型) 空类型 特殊类型(SEL, nil) 面向对象特性是什么? 答:继承性,封装性,多态性 import和#include有什么区别? 答:import 的功能和 include一样, 是将右边的

【Objective-C】04-第一个OC程序解析

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C.如果你还没有编程经验,或者对Objective-C.iOS开发不感兴趣,请忽略.学习本专题之前,建议先学习C语言专题. 在上一讲,已经新建了第一个OC程序,这讲就来解析它内部的代码. 查看项目结构可以发现这个程序中只有一个源文件:main.m 打开main.m文件,代码如下 1 #import <Foundation/Foundation.h> 2 3 in

智能指针 与 oc中的指针

智能指针 与 oc中的指针 智能指针的原理及实现 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副