Objective-c 深浅复制
深浅复制的定义:
浅复制:在复制时,对于被复制对象的每一层都是指针复制。
深复制:在复制时,对于被复制的对象至少有一层是对象复制。
完全复制:在复制时,对于被复制对象的每一层都是完全复制。
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 深浅复制的更多相关文章
- 详谈OC(object-c)深浅复制/拷贝-什么情况下用retain和copy
读前小提示:对于深浅复制有一个清楚的了解,对于学习oc的朋友来说,至关重要.那么首先,我们要明白深浅复制是如何定义的呢.这里为了便于朋友们理解,定义如下. 浅 复 制:在复制操作时,对于被复制的对象的 ...
- OC-深浅复制
[OC学习-26]对象的浅拷贝和深拷贝——关键在于属性是否可被拷贝 对象的拷贝分为浅拷贝和深拷贝, 浅拷贝就是只拷贝对象,但是属性不拷贝,拷贝出来的对象和原来的对象共用属性,即指向同一个属性地址. 深 ...
- Python基础之列表深浅复制和列表推导式
一.列表深浅复制: 浅拷贝内存图如下: 深拷贝内存图如下: 二.列表推导式: 实例: """ 列表推导式 练习:exercise01 """ ...
- C# 深浅复制 MemberwiseClone(转载)
最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考MSDN:https://docs.microsoft.com/zh-cn/dotnet/api/syst ...
- C# 深浅复制 MemberwiseClone
学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 最近拜读了大话设计模式:原型模式,该模式主要应用C# 深浅复制来实现的!关于深浅复制大家可参考 ...
- 潭州课堂25班:Ph201805201 第五课:格式化输出和深浅复制 (课堂笔记)
格式化输出和字符串转义 占位符 使用示意 作用 %s '%s %s' % ('hello', 'world') 表示占位的是str %d '%d %d' % (1, 2) 表示占位的是int %d ' ...
- C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone
C#设计模式(6)——原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...
- 【Python初级】由判定回文数想到的,关于深浅复制,以及字符串反转的问题
尝试用Python实现可以说是一个很经典的问题,判断回文数. 让我们再来看看回文数是怎么定义的: 回数是指从左向右读和从右向左读都是一样的数,例如1,121,909,666等 解决这个问题的思路,可以 ...
- Python 字符串拼接、格式化输出、深浅复制
拼接:"+"号(同类型可拼接) >>>li = [1,2] >>>li + li [1,2,1,2] >>>li*2 [1,2 ...
随机推荐
- 项目中引用ThinkPHP框架
ThinkPHP是一个宽度.兼容且简单的国产的轻量级框架,具有优良的性能,并且非常注重易用性. 那么,我们该如何将ThinkPHP引入自己的项目中,使得自己的项目可以使用这款优良的框架呢? 首先介绍下 ...
- sim卡中电话本(ADN)的简要格式
ADN的格式 ADN存放于sim卡下面3f00/7f10/6f3a,记录文件格式,其最小记录格式为14,最长为255(?),记录个数最大为255(?) 其后数14个字节是必有的,其前12个字节是电话号 ...
- Office 2010简体中文正式版完美终身破解版免费下载
名称:Microsoft Office Professional 2010 正式版(JK破解免序列号安装版) Microsoft Office 2010 专业版 优点:用官方Microsoft off ...
- (10)Xamarin.Android - 储存数据于Windows Azure
原文 Xamarin.Android - 储存数据于Windows Azure 如何将Xamarin.Android 与Windows Azure做结合,将Android APP上的数据丢到云端去储存 ...
- 深入Blocks分析
1.简介 从iOS4开始,苹果引入了这个C语言的扩充功能"Blocks",在一些特定的场景下也是一把利刃.我前面一篇博客中初步介绍了Blocks这个东西,主要是语法的介绍(< ...
- poj2389---大数乘法
#include<stdlib.h> #include<stdio.h> #include<string.h> #define MAX 100 int main() ...
- phpExcel在封装
<?php /** * 数组生成Excel * @author zouhao zouhao619@gmail.com * 使用示例 * $excel =new Excel(); $data=ar ...
- c# webConfig中的session超时详细设置
webConfig中的session超时详细设置 我们在webConfig中设置Session超时的时候,如果最后发行的地址是远程服务器,我们很多不是必须的属性并不用设置,如果设之后,倒不能让 ses ...
- linux php文件include失败 一个很神奇的问题
1. html生成失败,权限问题 前天用php生成模板,在windows上开发,include文件,读缓存写文件,顺风顺水,晚上写完后传到linux上html生成失败,发现文件和文件夹都没生成,网上查 ...
- 新视野OJ 2705 [SDOI2012]Longge的问题 (数论)
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 题解:求 sigma(gcd(i,n), 1<=i<=n<2^32) ...