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 赋值 拷贝 等问题记录的更多相关文章

  1. C++ //深拷贝与浅拷贝 //浅拷贝 : 简单的赋值拷贝操作 //深拷贝: 在堆区重新申请空间 进行拷贝操作

    1 //深拷贝与浅拷贝 2 3 //浅拷贝 : 简单的赋值拷贝操作 4 //深拷贝: 在堆区重新申请空间 进行拷贝操作 5 6 7 #include <iostream> 8 using ...

  2. python中list,tuple,dict,set等深浅拷贝的问题记录

    对于字典.元祖.列表 而言,进行赋值.浅拷贝和深拷贝时,其内存地址的变化是不同的. 1.赋值 赋值,只是创建一个变量,该变量指向原来内存地址,如: 1 2 3 n1 = {"k1" ...

  3. Python里的赋值 拷贝 深拷贝

    import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy. ...

  4. Block 在 ARC 下的拷贝

    前言 现在有一种说法,是开启arc选项时,已经没有栈上的block了,所以所有的block都不需要copy来拷贝到堆上了.那么这个说法正确与否呢? 结论是这个说法必须是错误的,首先的一点就是arc只是 ...

  5. day07 python列表 集合 深浅拷贝

    day07 python   一.知识点补充     1."".join() s = "".join(('1','2','3','4','5'))  #将字符串 ...

  6. 关于python中赋值、浅拷贝、深拷贝之间区别的深入分析

    当重新学习了计算机基础课程<数据结构和算法分析>后再来看这篇自己以前写的博文,发现错误百出.python内置数据类型之所以会有这些特性,归根结底是它采用的是传递内存地址的方式,而不是传递真 ...

  7. 【转】 c++拷贝构造函数(深拷贝,浅拷贝)详解

     c++拷贝构造函数(深拷贝,浅拷贝)详解 2013-11-05 20:30:29 分类: C/C++ 原文地址:http://blog.chinaunix.net/uid-28977986-id-3 ...

  8. c++拷贝构造函数(深拷贝,浅拷贝)详解

    一.什么是拷贝构造函数      首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: ; int b=a;   而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.  下面 ...

  9. 我在MySQL免安装版使用过程中遇到的问题记录

    我的MySQL版本为:mysql-5.7.16-winx64 安装时间为:2016年5月10号 由于是免安装版,下载好压缩文件之后解压到特定目录下,再打开命令行运行几行命令即可. 在一次操作中,发现无 ...

随机推荐

  1. hdu1151 Air Raid

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 增广路的变种2:DAG图的最小路径覆盖=定点数-最大匹配数 #include<iostream> ...

  2. lintcode 中等题:Letter Combinations of a Phone Number 电话号码的字母组合

    题目 电话号码的字母组合 给一个数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合. 下图的手机按键图,就表示了每个数字可以代表的字母. 样例 给定 "23" 返回 [& ...

  3. lintcode :continuous subarray sum 连续子数组之和

    题目 连续子数组求和 给定一个整数数组,请找出一个连续子数组,使得该子数组的和最大.输出答案时,请分别返回第一个数字和最后一个数字的值.(如果两个相同的答案,请返回其中任意一个) 样例 给定 [-3, ...

  4. lintcode 中等题:majority number III主元素III

    题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...

  5. Bitmap 和Drawable 的区别

    Bitmap - 称作位图,一般位图的文件格式后缀为bmp,当然编码器也有很多如RGB565.RGB888.作为一种逐像素的显示对象执行效率高,但是缺点也很明显存储效率低.我们理解为一种存储对象比较好 ...

  6. Case Study: Random Number Generation(翻译教材)

    很荣幸,经过三天的努力.终于把自己翻译的教材做完了,现在把它贴出来,希望能指出其中的不足.   Case Study: Random Number Generation Fig. 6.7  C++ 标 ...

  7. redhat6和ubuntu13.10在WMware player 下与Windows共享文件

    Redhat下: 点击VMware的 setting -> vmware tools install mount /dev/cdrom /mnt/cdromcd /mnt/cdrom里面有一个v ...

  8. Redis cluster学习 & Redis常识 & sort操作

    Redis中的5种数据类型String.Hash.List.Set.Sorted Set. Redis源码总代码一万多行. 这篇文章有一些Redis "常识" http://www ...

  9. ASP.NET MVC 学习8、Controller中的Detail和Delete方法

    参考:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and ...

  10. 用JAVA代码构造一个日历

    package day0603; import java.text.ParseException; import java.text.SimpleDateFormat; import java.uti ...