IOS的浅拷贝和深拷贝

什么是深拷贝和浅拷贝

浅拷贝:就是指针的复制,拷贝的指针跟原指针指向内存中的同一个位置的对象。至于对象的引用计数值是否+1,就是看拷贝的指针赋给给的变量是Strong类型的,还是week类型的。 如果是 strong类型,那么被拷贝的对象的内存计数值会+1,如果赋值给了weak类型的变量,那么被拷贝的对象的内存计数值会保持不便。

深拷贝:将内存中的对象拷贝一份,放到一个新的位置,并将这个指向这个新位置的指针指赋值给另外一个变量。

判断拷贝类型,关键的依据是指针所指向的对象在内存中的地址。

IOS中的拷贝方式有两种拷贝,一种是 copy ,另外一种是mutableCopy。 至于这两种方法对产生的拷贝属于‘浅拷贝‘还是‘深拷贝‘是要根据具体情况来决定的。

1:对于非容器类对象的拷贝。

什么是非容器类对象。 类似于  NSString ,NSNumber 等这种只能存储一个值的对象就叫做非容器类对象。

1.1:非容器类不可变对象的拷贝

    NSString *string = @"非容器类对象";

NSString *stringCopy = [string copy];

NSMutableString *MStringCopy = [string copy];

NSString *stringMutCopy = [string mutableCopy];

NSMutableString *MStringMutCopy = [string mutableCopy];

NSLog(@"对象的地址:%p",string);            //对象的地址:0x107d7e6d8

NSLog(@"对象的地址:%p",stringCopy);         //对象的地址:0x107d7e6d8

NSLog(@"对象的地址:%p",MStringCopy);      //对象的地址:0x107d7e6d8

NSLog(@"对象的地址:%p",stringMutCopy);     //对象的地址:0x7f9f397022e0

NSLog(@"对象的地址:%p",MStringMutCopy);    //对象的地址:0x7f9f395043c0

通过上面的打印结果来分析:

对于非容器类不可变对象:copy是属于浅拷贝,mutableCopy属于深拷贝

为什么会这样呢?

复制之后,IOS也是考虑到了内存控制和变量之间不相互干扰的原则。 对于内存中不可变的对象,因为对象不可变,所以对于使用这个对象的变量来说,指向同一个内存位置,即满足了使用相同的内容,又不必要开辟新内存空间,达到了节省内存空间的目的。

1.2:非容器类可变对象的拷贝

NSMutableString *string = [NSMutableString stringWithString:@"非容器类可变对象"];

NSString *stringCopy = [string copy];

NSMutableString *MStringCopy = [string copy];

NSString *stringMutCopy = [string mutableCopy];

NSMutableString *MStringMutCopy = [string mutableCopy];

NSLog(@"对象的地址:%p",string);       //对象的地址:0x7fc2c9f054a0

NSLog(@"对象的地址:%p",stringCopy);     //对象的地址:0x7fc2c9d08800

NSLog(@"对象的地址:%p",MStringCopy);    //对象的地址:0x7fc2c9d168e0

NSLog(@"对象的地址:%p",stringMutCopy);    //对象的地址:0x7fc2c9c065e0

NSLog(@"对象的地址:%p",MStringMutCopy);   //对象的地址:0x7fc2c9d179b0

可以看到上面的对象在内存中的地址都不相同,也就是说他们发生的拷贝都是深拷贝

总结:

1:对于非容器类不可变对象的拷贝,copy方法属于浅拷贝,mutableCopy属于深拷贝

2:对于非容器类可变对象的拷贝, copy方法属于深拷贝,mutableCopy也属于深拷贝

这样处理的依据是:对象之间的不干扰以及内存节省的原则

2:对于容器类对象的拷贝

什么是容器类对象。就是可以存储其他对象的对象。比如:NSArray,NSDictionary等等

2.1:不可变容器类对象的拷贝

时间: 2024-10-06 13:34:51

IOS的浅拷贝和深拷贝的相关文章

【iOS】浅拷贝和深拷贝

浅拷贝和深拷贝 浅拷贝即指针拷贝,可以认为是给一只狗加了一条绳子:深拷贝不但拷贝了对象的指针,还在系统中在分配了一块内存用来存放拷贝对象的内容,可以认为是产生了一条带绳子的新狗.即浅拷贝是两根绳子一条狗,深拷贝是两根绳子两条狗且每只狗对应各自的绳子. 图示: 深浅拷贝取决于拷贝后的对象是不是和被拷贝对象的地址相同,如果不同,则产生了新的对象,即为深拷贝.如果不同,则只是指针拷贝,相当于retain一次原对象,即为浅拷贝. copy与mutableCopy copy复制后的对象是不可变对象,mut

浅拷贝,深拷贝---ios

#import <Foundation/Foundation.h> @interface Father : NSObject <NSCopying,NSMutableCopying> @property (nonatomic,copy) NSString *name; @property (nonatomic,retain) NSNumber *age; -(id) initWithName:(NSString *)name withAge:(NSNumber *) age; @e

js对象浅拷贝和深拷贝详解

js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 var

渐析java的浅拷贝和深拷贝

作者: chenssy 出处: http://www.cnblogs.com/chenssy/ 首先来看看浅拷贝和深拷贝的定义: 浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值,这个方式被称为浅拷贝. 深拷贝:当一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值.这个方式称为深拷贝 也就是说浅拷贝只复制一个对象,传递引用,不能复制实例.而深拷贝对对象内部的引用均复制,它是创建一个新的实例,并且复制实例. 对于浅拷贝

正确实现浅拷贝和深拷贝

为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝:将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后,在副本中的修改不会影响到源对象对应的值.而引用类型的字段被复制到副本中的是引用类型的引用,而不是引用的对象,在副本中对引用类型的字段值做修改会影响到源对象本身. 深拷贝:同样,将对象中的所有字段复制到新的对象中.不过,无论是对象的值类型字段,还是引用类型字段,都会被重新创建并赋值,对于副本的修改,不会影响到源对象本身. 无论是浅拷贝还

深入浅拷贝和深拷贝。初学者的笔记

浅拷贝和深拷贝都是相对拷贝构造函数来讲的 下面代码实现浅拷贝, 1 #include <stdio.h> 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 class A 7 { 8 public : 9 A(int a=0):m_num(a){}; 10 A(const A &arr); 11 int set_num(); 12 private: 13 int m_num;

编写高质量代码改善C#程序的157个建议——建议14: 正确实现浅拷贝和深拷贝

建议14: 正确实现浅拷贝和深拷贝 为对象创建副本的技术称为拷贝(也叫克隆).我们将拷贝分为浅拷贝和深拷贝. 浅拷贝 将对象中的所有字段复制到新的对象(副本)中.其中,值类型字段的值被复制到副本中后,在副本中的修改不会影响到源对象对应的值.而引用类型的字段被复制到副本中的是引用类型的引用,而不是引用的对象,在副本中对引用类型的字段值做修改会影响到源对象本身. 深拷贝 同样,将对象中的所有字段复制到新的对象中.不过,无论是对象的值类型字段,还是引用类型字段,都会被重新创建并赋值,对于副本的修改,不

C++拷贝构造函数(浅拷贝、深拷贝)

下面举一个简单的例子说明对象之间的拷贝(此例中没有自定义拷贝构造函数,在调用拷贝构造函数的时候,编译器会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝)浅拷贝: #include<iostream> using namespace std; class CExample { private:int a; public: CExample(int b) { a=b; } void Show() { cout<<a<<endl; } }; int main(

C# 浅拷贝与深拷贝区别

浅拷贝:给对象拷贝一份新的对象.浅拷贝的定义—— 只对值类型(或string)类型分配新的内存地址.深拷贝:给对象拷贝一份全新的对象.深拷贝的定义—— 对值类型分配新的内存地址,引用类型.以及引用类型的内 http://blog.csdn.net/lai123wei/article/details/7217365 C# 浅拷贝与深拷贝区别,布布扣,bubuko.com