NSarray 赋值 拷贝 等问题记录
1.
NSArray * a1 = @[@"1",@"2",@"3"];
NSArray * a2 = a1;
a1跟a2所指向的地址是一样的
NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);
2.
NSArray * a1 = @[@"1",@"2",@"3"];
NSArray * a2 = [a1 copy];
NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);
a1跟a2所指向的地址是一样的 ,所以对于不可变的NSArray 来说,copy只是简单的增加一个持有者,并没有重新开一份地址。
3.
NSArray * a1 = @[@"1",@"2",@"3"];
NSArray * a2 = [a1 mutableCopy];
NSLog(@"a1:%p a2:%p a1p:%p a2p:%p",&a1,&a2,a1,a2);
a1跟a2所指向的地址也是不一样的 ,也就是说a2是a1的一份拷贝
4.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];
NSArray * a1 = @[str1,str2];
[a1[0] appendString:@"456"];
a1是不可操作的,你不可能操作比如a1[0] = @"1";因为a1是不可变的,但是a1内的变量是否可变就由不得a1控制了,比如str1是一个可变的string,那它当然是可变的了。
5.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];
NSArray * a1 = @[str1,str2];
[a1[0] appendString:@"456"];
NSArray * a2 = a1;
[a2[1] appendString:@"def"];
根据 中的描述,a2指向的地址跟a1指向的地址是一样的,那么经过上面的修改之后,str1=123456 str2=abcdef
6.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];
NSArray * a1 = @[str1,str2];
[a1[0] appendString:@"456"];
NSArray * a2 = [a1 copy];
[a2[1] appendString:@"def"];
根据中的描述,a2指向的地址跟a1指向的地址是一样的,所以执行的结果跟5是一样的。
7.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableString * str2 = [NSMutableString stringWithFormat:@"abc"];
NSArray * a1 = @[str1,str2];
[a1[0] appendString:@"456"];
NSArray * a2 = [a1 mutableCopy];
[a2[1] appendString:@"def"];
根据3 的描述a1 跟a2所指向的地址是不一样的,也就是a2是a1的一份拷贝,而在拷贝的时候,只拷贝了一级,所以a2里面的内容同样也指向str1跟str2,那么当通过[a2[1] appendString:@"def"];来操作的时候,实际上是对str2进行了操作,所以也会影响到a1的输出。
===========================================================================
8.
NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];
NSMutableArray * a2 = a1;
a1[0] = @"111";
NSLog(@"a1p:%p a2p:%p",a1,a2);
但是他们指向的地址都是一样的,所以对a1作的操作,也会影响到a2.
9.
NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];
NSMutableArray * a2 = [a1 copy];
a1[0] = @"111";
a2[0] = @"222";
这里的a1跟a2所指向的地址是不一样的,通过修改a1,是不更改a2的。而通过copy出来的a2,虽然声明的是NSMutableArray类型,但是实际上却是NSArray类型,所以执行a2[0] = @"222";操作在编译的时候不会出现问题,但是在运行的时候是会crash掉的。
10.
NSMutableArray * a1 = [NSMutableArray arrayWithObjects:@"1",@"2",@"3",nil];
NSMutableArray * a2 = [a1 mutableCopy];
a1[0] = @"111";
a2[1] = @"222";
这里的a1跟a2所执行的地址是不相同的,所以a1[0] = @"111";的修改只针对了a1,a2[1] = @"222";的修改只针对a2.
11.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableArray * a1 = [NSMutableArray arrayWithObjects:str1,@"2",@"3",nil];
NSMutableArray * a2 = [a1 copy];
[a1[0] appendString:@"456"];
a1[1] = @"2222";
执行上面之后,得到的结果是 a1:@"123456",@"2222",@"3" a2:@"123456",@"2",@"3"
12.
NSMutableString * str1 = [NSMutableString stringWithFormat:@"123"];
NSMutableArray * a1 = [NSMutableArray arrayWithObjects:str1,@"2",@"3",nil];
NSMutableArray * a2 = [a1 mutableCopy];
[a1[0] appendString:@"456"];
a1[1] = @"2222";
执行上面之后,得到的结果是 a1:@"123456",@"2222",@"3" a2:@"123456",@"2",@"3"
//////
总结下,对于“不可变”变量,“=” “copy”操作只是增加了持有者的数量,"mutableCopy"会重新拷贝出一分。
对于“可变”变量,"="增加持有者数量,"copy"拷贝出一份“不可变”(不能修改)变量,“mutableCopy”拷贝出一份可变变量。
这里的所有的“拷贝”指的都是浅拷贝 ,例子11中,执行a2 = [a1 copy];之后,a2的数据应该是"p->str1","2","3" 应为a1[0]指向的是str1,而a2的第一个元素的值也是指向str1,所以通过a1修改第一个元素,也影响到了a2.
NSarray 赋值 拷贝 等问题记录的更多相关文章
- C++ //深拷贝与浅拷贝 //浅拷贝 : 简单的赋值拷贝操作 //深拷贝: 在堆区重新申请空间 进行拷贝操作
1 //深拷贝与浅拷贝 2 3 //浅拷贝 : 简单的赋值拷贝操作 4 //深拷贝: 在堆区重新申请空间 进行拷贝操作 5 6 7 #include <iostream> 8 using ...
- python中list,tuple,dict,set等深浅拷贝的问题记录
对于字典.元祖.列表 而言,进行赋值.浅拷贝和深拷贝时,其内存地址的变化是不同的. 1.赋值 赋值,只是创建一个变量,该变量指向原来内存地址,如: 1 2 3 n1 = {"k1" ...
- Python里的赋值 拷贝 深拷贝
import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy. ...
- Block 在 ARC 下的拷贝
前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...
- day07 python列表 集合 深浅拷贝
day07 python 一.知识点补充 1."".join() s = "".join(('1','2','3','4','5')) #将字符串 ...
- 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析
当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...
- 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解
c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...
- c++拷贝构造函数(深拷贝,浅拷贝)详解
一.什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量. 下面 ...
- 我在MySQL免安装版使用过程中遇到的问题记录
我的MySQL版本为:mysql-5.7.16-winx64 安装时间为:2016年5月10号 由于是免安装版,下载好压缩文件之后解压到特定目录下,再打开命令行运行几行命令即可. 在一次操作中,发现无 ...
随机推荐
- linux上应用程序的执行机制
linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
- mysql级联更新的两种方式:触发器更新和外键
1.mysql级联更新有两种方式:触发器更新和外键更新. 2.触发器更新和外键更新的目的都是为了保证数据完整性. 我们通常有这样的需求:删除表Table 1中记录,需要同时删除其它表中与Table 1 ...
- java:IO-读写大文件
import java.io.*; class Test { public static void main(String args[]){ FileInputStream fin =null; Fi ...
- ArcEngine查询、添加、删除要数的方法
原文地址:http://www.cnblogs.com/caodajieup/archive/2011/11/02/2232658.html 1.查找数据 1).利用FeaturCursor进行空间查 ...
- Python数字加千分符
1.最简单的内置format函数: >>> format(1234567890,',') '1,234,567,890' 2.正则表达式: import re def formatN ...
- xargs的- n1参数
起因在对一堆*.tar.gz文件解压缩时,发现tar xvfz *.tar.gz不管用,一查,原来是tar xvfz *.tar.gz会被shell给拆成tar xvfz a.tar.gz b.tar ...
- 车牌识别LPR(八)-- 字符识别
第八篇:字符识别 车牌定位.车牌倾斜校正.车牌字符分割都是为车牌字符识别做的前提工作,这些前提工作直接关系到车牌识别系统的性能.车牌字符识别是车牌识别系统的核心部分,车牌字符识别的准确率是衡量车牌识 ...
- Android开发之通过反射获取到挂断电话的API
Android开发黑名单工具类,需要用到挂断电话的API,但是该API处于隐藏状态,需要通过反射得到该方法.. 步骤: 1.通过当前类获取到ServiceManager的字节码 Class< ? ...
- STL源码中map和set中key值不能修改的实现
前言 最近正好刚刚看完,<stl源码剖析>这本书的map和set的源码部分.但是看完之后又突然发现,之前怎么没有注意到map和set容器中key不能修改是怎么实现的.故,特此整理如下. s ...
- svn is already under version control问题解决
svn ci 时出现 xx is already under version control,然后无法提交,出现这个问题的原因是你所提交的文件或目录是其他SVN的东西,即下面有.svn的目录,需要先把 ...