深浅复制的定义:

  浅复制:在复制时,对于被复制对象的每一层都是指针复制。

  深复制:在复制时,对于被复制的对象至少有一层是对象复制。

  完全复制:在复制时,对于被复制对象的每一层都是完全复制。

  retain: 始终是潜复制,引用计数器每次加一,返回对像是否可变与被复制对象保持一致。

  copy: 对于可变对象是深复制,引用计数不改变。对于不可变对象是浅复制,引用对象每次加一,始终返回一个不可变对象。

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

  

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

  可变对象: 无论值发生改变,其内存首地址都不会发生改变。

  引用计数:为了让使用者知道,该对象有多少个拥有者。

  下面通过一个程序来具体展现它的用法:

  

 #import <Foundation/Foundation.h>

 int main(int argc , const char *argv[]){
@autoreleasepool {
NSLog(@"-------------不可变对象到不可变对象的转换-------------");
NSString *str1 = @"aaaa";
NSString *str2 = [str1 copy]; // 对于不可变对象来说,是潜复制,计数器加一,始终返回一个不可变对象
NSLog(@"str1 = %p , str2 = %p",str1,str2); // str1 和 str2 地址相同,没有生成新的字符串 NSLog(@"-------------可变对象到可变对象的转换---------------");
NSMutableString *str3 = [NSMutableString stringWithString:@"aaaa"];
NSMutableString *str4 = [str3 mutableCopy]; // copy对于可变字符串来说是深复制
NSLog(@"str3 = %p , str4 = %p",str3,str4); // str3 和 str4 地址不同,生成新的字符串 NSLog(@"-------------可变对象到不可变对象的转换---------------");
str1 = [str3 copy]; // copy 对于可变字符来说是深复制
NSLog(@"str1 = %p , str3 = %p",str1,str3); NSLog(@"-------------不可变对象到可变对象的转换---------------");
str3 = [str1 mutableCopy]; // copy 对于不可变字符串来说是浅复制
NSLog(@"str1 = %p , str3 = %p",str1,str3); }
return ;
}
 

运行结果:

  


2016-03-12 17:16:21.062 test[2349:183297] -------------不可变对象到不可变对象的转换-------------


2016-03-12 17:16:21.063 test[2349:183297] str1 = 0x100001070 , str2 = 0x100001070


2016-03-12 17:16:21.064 test[2349:183297] -------------可变对象到可变对象的转换---------------


2016-03-12 17:16:21.064 test[2349:183297] str3 = 0x100200210 , str4 = 0x1002003d0


2016-03-12 17:16:21.064 test[2349:183297] -------------可变对象到不可变对象的转换---------------


2016-03-12 17:16:21.064 test[2349:183297] str1 = 0x6161616145 , str3 = 0x100200210


2016-03-12 17:16:21.064 test[2349:183297] -------------不可变对象到可变对象的转换---------------


2016-03-12 17:16:21.065 test[2349:183297] str1 = 0x6161616145 , str3 = 0x1002002d0

 

什么时候用到深浅拷贝?

  深拷贝是在要将一个对象从可变(不可变)转化为不可变(可变)或者将一份内容克隆一份时用到的。浅拷贝是在要复制一个对象的指针时用到的。

Objective-c 深浅复制的更多相关文章

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

    读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...

  2. OC-深浅复制

    [OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深 ...

  3. Python基础之列表深浅复制和列表推导式

    一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...

  4. C# 深浅复制 MemberwiseClone(转载)

    最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考MSDN:https://docs.microsoft.com/zh-cn/dotnet/api/syst ...

  5. C# 深浅复制 MemberwiseClone

    学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考 ...

  6. 潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)

    格式化输出和字符串转义 占位符 使用示意 作用 %s '%s %s' % ('hello', 'world') 表示占位的是str %d '%d %d' % (1, 2) 表示占位的是int %d ' ...

  7. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  8. 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题

    尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...

  9. Python 字符串拼接、格式化输出、深浅复制

    拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...

随机推荐

  1. __I、__O 、__IO volatile是什么?怎么用? .

    这是ST库里面的宏定义,定义如下: #define __I volatile const /*!< defines 'read only' permissions */ #define __O ...

  2. vagrant打造自己的开发环境

    vagrant打造自己的开发环境 缘由: 在网上看到斌哥,爽神都写了关于vagrant的博客,都在说很强大,所以很好奇这玩意怎么个强大,然后也就自己来一发玩玩看看. 真实缘由: 说实话是电脑配置太低, ...

  3. centos6.5 openvpn安装配置

    http://m.jb51.net/?host=www.jb51.net&src=http%3A%2F%2Fwww.jb51.net%2Fsoftjc%2F150885.html

  4. python-操作exel(xlrd,xlwt)

    1.使用第三方库 python中处理excel表格,常用的库有xlrd(读excel)表.xlwt(写excel)表.openpyxl(可读写excel表)等. xlrd读数据较大的excel表时效率 ...

  5. mac下通过xcodebuild使用oclint

    step1 :下载oclint并安装 下载地址: http://oclint.org/downloads.html 选择mac os x或者darwin的包,下载到本地. 文件夹类似以下: oclin ...

  6. python手记(36)

    #!/usr/bin/env python #-*- coding: utf-8 -*- #code:myhaspl@qq.com import cv2 import numpy as np fn=& ...

  7. Linux系统CentOS6.2版本号下安装JDK7具体过程

    前言:        java 是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaEE( ...

  8. Oracle 11g新特性虚拟列分区

    如今有个需求:一个单据表要依照月份来分区.假设是在Oracle 10g上,仅仅能再加一个字段. 在Oracle 11g以后就不一样了.能够用虚拟列处理. SQL> select * from v ...

  9. Android SQLite 事务处理

    应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.我 ...

  10. Duff 装置中case情况越多性能越好

    猜想:Duff装置再循环里面,直接调用的方法越多(也就是case的数量比较多),性能相对越好 ???!!! 我们基于Duff装置来做进一步的测试. 然后分别添加两个新的函数,一个函数式 case有4种 ...