#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;
}

转载于:https://www.cnblogs.com/wohaoxue/p/4819829.html

iOS中的 深拷贝和浅拷贝相关推荐

  1. IOS中的深拷贝和浅拷贝

    标签: 什么是深拷贝?什么是浅拷贝? 为什么经常看到字符串属性要这样定义,那个copy是神马意思? @property(nonatomic,copy)NSString* name; 为什么下面的写法是 ...

  2. (0056)iOS开发之深拷贝与浅拷贝

    参考: http://blog.csdn.net/qq_17007915/article/details/50503043 http://www.cnblogs.com/ludashi/p/38941 ...

  3. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  4. python中的深拷贝与浅拷贝

    浅拷贝的时候,修改原来的对象,深拷贝的对象不会发生改变. 对象的赋值 对象的赋值实际上是对象之间的引用:当创建一个对象,然后将这个对象赋值给另外一个变量的时候,python并没有拷贝这个对象,而只是拷 ...

  5. C语言中的深拷贝和浅拷贝

    http://www.cnblogs.com/zhanggaofeng/p/5421804.html C语言中的深拷贝和浅拷贝 //C语言中的深拷贝和浅拷贝 #define _CRT_SECURE_N ...

  6. python中关于深拷贝和浅拷贝的详解

    python中关于深拷贝和浅拷贝的详解 概述 在python的语法中,有两种变量的拷贝方式 一种是深拷贝,一种是浅拷贝 我们先说深拷贝 语法 这里需要通过导入系统的copy模块中的deepcopy才可 ...

  7. vb.net中递归退到最外层_面试题被问到再也不慌,深究JavaScript中的深拷贝与浅拷贝...

    " 点个关注,养成习惯,带你python爬虫的过程中学习前端 " JavaScript中的深拷贝和浅拷贝是前端面试中频繁被问到的一道题, 于是我也自己去查阅了一些资料, 然后动手敲 ...

  8. js中的深拷贝和浅拷贝区别

    js中的深拷贝和浅拷贝与值传递和引用传递有着些许的关联,都是根据堆栈中数据的储存来传递数据. 下面主要说一下我对深拷贝和浅拷贝的理解: 简单举个例子来说明:当我们声明一个a变量并且赋值,并且让b等于a ...

  9. 详谈Javascript中的深拷贝和浅拷贝

    数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝. 浅拷贝 复制的对象和原始对象属性 ...

  10. Javascript中的深拷贝和浅拷贝

    文章目录 JavaScript中的变量类型 深拷贝和浅拷贝的理解 深拷贝和浅拷贝的实现方式 为什么需要深拷贝和浅拷贝 JavaScript中的变量类型 (1).基本类型 JavaScript中的基本类 ...

最新文章

  1. 深度盘点Python11个主流框架:Pandas、Django、Matplotlib、Numpy、PyTorch......
  2. 012.成型版回声服务器
  3. python 写入csv有引号_python读带引号的csv--解决 'utf-8' codec can't decode
  4. Spark算子:RDD基本转换操作(2)–coalesce、repartition
  5. 服务器不在工作_十次方:服务器租用一般有哪些品牌
  6. Gdiplus的使用 gdi+
  7. R语言绘制花瓣图flower plot
  8. TeamViewer正版许可证到底多少钱?
  9. 交换机中查找IP与mac对应关系命令
  10. 关于ksps(A/D转换速率单位)
  11. 多年来被互联网深深洗脑
  12. Python-玩转数据-利用百度高德经纬度地图定位
  13. 使用Vite搭建基础项目
  14. 塑料壳上下扣合的卡扣设计_一种组合玩具的塑料卡扣的制作方法
  15. windows11 取消windows登录密码 共享文件夹 输入法 去掉屏保广告 右键恢复原样
  16. 用于通过声波捕获显示视觉,触觉和音频的全息显示(A volumetric display for visual, tactile and audio presentation using acous)
  17. STAR建索引内存不够
  18. 【车载】ABS/BAS/BA防抱死制动系统
  19. QCC3031 32M Flash精简 (QCC30xx系列应该通用)
  20. H.266/VVC帧间预测技术学习:带有运动矢量差的Merge技术(Merge mode with MVD)

热门文章

  1. SegmentFault D-Day 2016 年度总结报告
  2. Riemann映射定理
  3. 识别验证码,你有几分成功率?
  4. Android开发中的SQLite事务处理,即beginTransaction()方法
  5. 推荐第三方SQL查询工具
  6. 《汇编语言》第一章笔记
  7. protobuf反射详解及应用(pb/json相互转换)
  8. python的ctypes模块详解数组_如何使用Python的ctypes和readinto读取包含数组的结构?...
  9. cntrol层的代码作用
  10. echarts迁徙图 vue_vue中echarts引入中国地图的案例