iOS中的 深拷贝和浅拷贝

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
//    一: copy 与 retain 的区别
//    谁才有引用计数的概念:
//    1. 堆区空间才有引用计数概念.
//    2. 堆区的对象才会有引用计数.
    //%ld: - 1           %lu:18446744073709551615

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

//copy:对于可变对象为深拷贝,引用计数不改变;
    //对于不可变对象是浅拷贝,引用计数每次加一。
    //始终返回一个不可变对象。
    //NSString一般建议用copy,这样再更改数据不影响原来的赋值

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

//    二:浅拷贝与深拷贝的区别

    //浅拷贝的定义: 就是复制对象的值的时候,不管复制多少,所以的值都指向同一个对象.
    //深拷贝的定义: 增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存.

    //浅拷贝 是指针拷贝, 深拷贝 是内容拷贝.

    //举例    浅拷贝: 一个人一开始叫张三,后来改名叫李四了,可是还是同一个人.相互影响.
    //           深拷贝: 一个人一开始叫张三,后来克隆个人叫李四,不是同一个人.不会相互影响.

    //    1. 当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopying 协议的类可以发送copy消息,遵守NSMutableCopying 协议的类才可以发送mutableCopy消息。
    //    2. 如果想自定义一下copy 那么就必须遵守NSCopying,并且实现 copyWithZone: 方法,如果想自定义一下mutableCopy 那么就必须遵守NSMutableCopying,并且实现 mutableCopyWithZone: 方法。

//    三. ios提供了copy和mutablecopy方法,copy就是复制了一个不可变的对象,而mutablecopy就是复制了一个可变的对象.

 //1. 对于非容器类对象的拷贝.(NSString, NSNumber等)
    //对于一个不可变对象的拷贝:
//   NSString *str1 = [[NSString alloc] initWithFormat:@"bingbingbing"];
//    NSString *str2 = [str1 copy];
//    NSMutableString *str3 = [str1 mutableCopy];
//    NSLog(@"%p, %p, %p", str1, str2, str3);
//    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);
//    [str1 release];
//  NSLog(@"%p, %p, %p", str1, str2, str3);
//    NSLog(@"%lu, %lu, %lu",str1.retainCount, str2.retainCount, str3.retainCount);

 //如果对一不可变对象复制,copy是浅拷贝, mutableCopy就是深拷贝。

    //对于一个可变对象的拷贝:
//    NSMutableString *string1 = [[NSMutableString alloc] initWithFormat:@"冰冰"];
//    NSString *string2 = [string1 mutableCopy];
//    NSMutableString *string3 = [string1 mutableCopy];
//    NSMutableString *string4 = [string1 copy];
//    NSLog(@"%p, %p, %p, %p", string1, string2, string3, string4);
//    NSLog(@"%lu, %lu, %lu, %lu", string1.retainCount, string2.retainCount, string3.retainCount, string4.retainCount);

//如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。

    //2. 对容器类对象的拷贝.(NSArray, NSDictionary等)

//
//    NSArray *arr1 = [NSArray arrayWithObjects:@"bing", @"liang", nil];
//    NSArray *arr2 = [arr1 copy];
//    NSMutableArray *arr3 = [arr1 mutableCopy];
//    NSLog(@"%p, %p, %p", arr1, arr2, arr3);
//    NSLog(@"%lu, %lu, %lu", arr1.retainCount, arr2.retainCount, arr3.retainCount);
    //arr1是和arr2指向相同的对象,里面的元素也是指向相同的指针,
    //这里arr2 是对 arr1 的浅拷贝, arr3 是对 arr1 的深拷贝.
//    for (NSString *p in arr1) {
//        NSLog(@"%p",p);
//    }
//    NSLog(@"_________________________________");
//    for (NSString *p in arr2) {
//        NSLog(@"%p",p);
//    }
//    NSLog(@"_________________________________");
//    for (NSString *p in arr3) {
//        NSLog(@"%p",p);
//    }
    //但是数组里的元素都是浅拷贝.

   /*
     NSMutableString *mutabelString1 = [NSMutableString stringWithFormat:@"bingbing"];
     NSMutableString *mutabelString2 = [NSMutableString stringWithFormat:@"laingliang"];
*/
    NSMutableArray *array1 = [NSMutableArray arrayWithObjects:@"bingbing", @"laingliang", nil];
    NSArray *array2 = [array1 copy];
    NSMutableArray *array3 = [array1 mutableCopy];
    NSMutableArray *array4 = [array1 copy];
    NSLog(@"%p, %p, %p, %p", array1, array2, array3, array4);
    NSLog(@"%lu, %lu, %lu, %lu", array1.retainCount, array2.retainCount, array3.retainCount, array4.retainCount);

    //如果容器的某一元素是不可变的,那你复制完后该对象仍旧是不能改变的,因此只需要指针复制即可。
//        for (NSString *p in array1) {
//            NSLog(@"%p",p);
//        }
//    NSLog(@"_________________________________");
//        for (NSString *p in array2) {
//            NSLog(@"%p",p);
//        }
//    NSLog(@"_________________________________");
//        for (NSString *p in array3) {
//            NSLog(@"%p",p);
//        }
//    NSLog(@"_________________________________");
//       for (NSString *p in array4) {
//            NSLog(@"%p",p);
//    }

    //copy 和 retain 的区别 :
    //在Foundation对象中,当copy是一个不可变的对象时,作用相当于retain, 都是浅拷贝.
    //当是一个 可变对象时, copy 是深拷贝, retain 是浅拷贝.

    //copy 和 MutableCopy 的区别 :
    //在Foundation对象中,copy是一个不可变的对象时,浅拷贝.
    //当我们使用copy一个可变对象时, 深拷贝, 但是副本对象是不可变的.
    //当使用mutableCopy时,不管原对象是否可变,副本是可变的,并且实现真正意义上的深拷贝.

    //3. 对象的 自定义拷贝:
    //深拷贝和浅拷贝的区别就在于copyWithZone方法的实现(略)
    // 浅拷贝 复制对象本身,对象里的属性、包含的对象不做复制
    // 深拷贝 复制全部,包括对象的属性和其他对象

    return 0;
}
时间: 2024-11-03 22:03:56

iOS中的 深拷贝和浅拷贝的相关文章

Java中的深拷贝和浅拷贝 原型模式

1: Java中浅拷贝和深拷贝的定义:      浅拷贝:就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.      深拷贝:就是两个对象的值相等,但是互相独立. (深拷贝才是真正的拷贝,浅拷贝只是将引用指向了同一份对象) 2:Java中几种常见的拷贝操作: (1)"="操作:也就是赋值操作: (2)拷贝构造函数:拷贝构造函数就是构造函数的参数的类型是该构造函数所在的类,即参数就是该类的一个对象. <span style="font-size:

浅谈Java中的深拷贝和浅拷贝

浅谈Java中的深拷贝和浅拷贝(转载) 原文链接: http://blog.csdn.net/tounaobun/article/details/8491392 假如说你想复制一个简单变量.很简单: [java] view plaincopyprint? int apples = 5; int pears = apples; int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float

**Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解 这篇文章主要介绍了Python中的深拷贝和浅拷贝详解,本文讲解了变量-对象-引用.可变对象-不可变对象.拷贝等内容. 要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念: 变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) [变量-对象-引用] 在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/

python中的深拷贝和浅拷贝

1.深拷贝VS浅拷贝 python中的深拷贝和浅拷贝和java里面的概念是一样的, 所谓浅拷贝就是对引用的拷贝 (里面的数据不拷贝出来,其中的数据与原对象里面数据用的是相同的地址空间) 所谓深拷贝就是对对象的资源的拷贝 (里面的数据拷贝出来.深拷贝有自己的存储空间,有自己定义的数据,跟原对象一点关系也没有) 2.对赋值的认识: 赋值:将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ) 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空

iOS 开发之深拷贝与浅拷贝

copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化.copy减少对象对上下文的依赖. retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝. 当然在ios中并不是所有的对象都支持copy,mutableCopy,遵守NSCopyin

Objective-C中的深拷贝和浅拷贝

在Objective-C中对象之间的拷贝分为浅拷贝和深拷贝.说白了,对非容器类的浅拷贝就是拷贝对象的地址,对象里面存的内容仍然是一份,没有新的内存被分配.对非容器类的深拷贝就是重写分配一块内存,然后把另一个对象的内容原封不动的给我拿过来.对容器类的深拷贝是对容器中的每个元素都进行拷贝,容器类的浅拷贝是对容器里的内容不进行拷贝,两个容器的地址是不同的,但容器里的所装的东西是一样的,在一个容器中修改值,则另一个浅拷贝的容器中的值也会变化.所以对非容器类看对象是否为深拷贝还是浅拷贝就得看对象的内存地址

C++中的深拷贝和浅拷贝 QT中的深拷贝,浅拷贝和隐式共享

下面是C++中定义的深,浅拷贝 当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用.也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用.以下情况都会调用拷贝构造函数: (1)一个对象以值传递的方式传入函数体 (2)一个对象以值传递的方式从函数返回 (3)一个对象需要通过另外一个对象进行初始化. 如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝.位拷贝又称浅拷贝,后面将进行说

Javascript中的深拷贝和浅拷贝

文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类型有五种: null.undefined.boolean.string.number. 变量是按值存放的,存放在栈中的简单数据段,可以直接访问. (2).引用类型 引用类型包括对象和数组,其存储在堆当中,而变量是指针,指向堆. 当我们访问的时候,实际上是访问指针,然后指针去寻找对象或数组. 深拷贝与

C#中的深拷贝与浅拷贝

1.基本的概念: 首先我们应该了解一下什么叫深拷贝与浅拷贝(Deep Copy and Shallow Copy). a.浅拷贝(Shallow Copy影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用. b.深拷贝(Deep Copy 深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.完全产生新对象. 深拷贝与浅拷贝不同的是对于引用拷贝的处理,深拷贝将会在新对象中创建和原是对象中对应值类型的字段并且赋值.浅拷贝不会创建新引用类型,会返回相同的类 型引用.深拷贝会重新创建新