好久没写博客了,今天看到同事的代码中用到了 copy 这个 方法,之前也有了解过,但是不是很深入,概念都比较模糊,虽然已经搞了一年的 iOS 开发,但是 还是 不太了解 真是惭愧,于是乎自己就写了点儿东西来测试,我知道iOS中都是指针 也就是说 如果 有一个 array ,然后申明一个 array1 = [array copy];那么array1和array是指向同一片内存的,所以 当你改变array1 的内容,那么array 也就自然跟着变化了,于是乎便有了以下代码和出现的问题:

 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"",@"",@"",nil];
NSMutableArray *array1 = [array copy];
NSMutableArray *array2 = array1;
NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
[aray1 removeObjectAtIndex:];
NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
按照我们的思路,那么第一次打印出应该全都是 111,222,333,没错,对的
那么第二次打印出什么呢?同样 我们也想着应该是 array 111,222,333, 而 array1 和 array2
打印应该是 111,333,对吗?答案是 错的,为什么呢,因为程序运行到 [aray1
removeObjectAtIndex:1];就报错了,那么报什么错呢,为什么会报错呢?
 

-[__NSArrayI removeObjectAtIndex:]:
unrecognized selector sent to instance
 这个就是错误,

按照我们的经验,这种错误大概也就array没有这个方法 或者 不能响应这个
方法,怎么可能,明明是 NSMutableArray类型的
怎么可能没有或者不能响应removeObjectAtIdex方法呢,

后来我想了好久,可能是 copy 的问题,于是我把 NSMutableArray
*array1 = [array copy]; 换成 NSMutableArray *array1 = [NSMutableArray
arrayWithArray:array];

这样就不会报错了,问题解决了,

后来我想,虽然问题解决了,但是 这个问题究竟是出在什么地方,为什么会这样呢,想了好久
我大概在猜测,可能是 虽然 array1 我们申明了 NSMutableArray 但是 有可能 copy 后 就成了
NSArray了 之前我有遇到过类似的问题,于是 我就上网查资料 仔细看看 copy
究竟是怎么一回事儿,后来终于明白了,copy是浅拷贝,虽然申明的是NSMutableArray 但是 经过copy
之后的数组还是不可变的,如果要让他可变那么把 [array copy];改成[array
mutableCopy];就可以了,果然我一改 问题立刻就解决了,结果和我们预期一样,

通过这个问题,总结如下:copy 是浅拷贝虽然申明为
NSMutable的变量,结果还是不可变的,如果要让copy之后的变量可变,那么用 mutableCopy 。

虽然开发了一年iOS 但是 基础的东西都还不是太明白,真是 惭愧,还有,如果用
NSString来验证指针指向的问题,似乎不行,因为 NSString *string = @"123";这个方法和 NSString
*string = [[NSString alloc]
initWithString:@"123"];似乎是等价的(这个是我自己猜测的,我之前用过string来验证,谁让string这么简单方便呢,大
家开始都会很自然的想到用string,我也不例外啦),每次都会new出一片内存,这样就达不到我们想要的效果了,所以如果要用
NSString 来验证的话,string初始化最好用 [[NSString alloc]
initWithString:@"123"];这样应该可以。

【转】 NSArray copy 问题的更多相关文章

  1. Objective-C中的Strong、Copy与MutableCopy

    面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...

  2. 对copy、mutableCopy理解

    Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...

  3. 01-Foundation简介、NSObject、copy、NSString

    目录: 一.Foundation常用类 二.Foundation简介 三.NSObject 四.NSString 回到顶部 一.Foundation常用类 1 NSObject.NSString.NS ...

  4. HEC-ResSim原文档

              HEC-ResSim Reservoir System Simulation             User's Manual       Version 3.1 May 201 ...

  5. NSArray和NSMutableArray的copy和MutableCopy

    NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

  6. 给NSMutableArray添加copy属性就变成了NSArray

    -copy, as implemented by mutable Cocoa classes, always returns their immutable counterparts. Thus, w ...

  7. [bugfix]copy属性参数将NSMutableArray变为NSArray类型

    问题:NSMutableArray 声明为 copy 属性参数后即使接受NSMutableArray变量依然为NSArray变量 测试: 属性申明为: 1 @property (nonatomic, ...

  8. 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

    因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本. 如果我们使用是 str ...

  9. --NSArray与NSMutableArray用copy修饰还是strong(转)

    一.NSMutableArray 被copy.strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变 ...

随机推荐

  1. Oracle OCI-22053:溢出错误

    Oracle 数值数据类型最多可存储 38 个字节的精度.当将 Oracle 数值转换 为公共语言运行库数据类型时,小数点后边的位数可能过多,这会导致此错误.   查询29万笔数据,报此错误,分析应该 ...

  2. Dollars

    uva147: 题意:给你几种钱币,在给你一个钱的数目,问有多少种用这些钱来组成这个数目. 题解:完全背包,不过此时要把钱的数目*100,因为是小数,背包的容量都是整数,然后dp,求出每个容量的数目即 ...

  3. 关于javascript document.createDocumentFragment() 替代insertCell、insertRow这种每次都使用大量的资源导致浏览器崩溃

    documentFragment 是一個無父對象的document對象他支持以下DOM2方法: appendChild, cloneNode, hasAttributes, hasChildNodes ...

  4. 【HDOJ】3419 The Three Groups

    记忆化搜索. /* 3419 */ #include <cstdio> #include <cstring> #include <cstdlib> #define ...

  5. 【HDOJ】1401 Solitaire

    双向BFS+状态压缩. /* 1401 */ #include <iostream> #include <queue> #include <map> #includ ...

  6. 【POJ】2418 Hardwood Species

    简单字典树. #include <cstdio> #include <cstring> #include <cstdlib> #define MAXN 128 ty ...

  7. 2015 BJOI 0102 Secret

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=477 试题描述: 在 MagicLand 这片神奇的大陆上,有样一个古老传说 ...

  8. 暴力求解——Equivalent Strings

    Submit Status Description Today on a lecture about strings Gerald learned a new definition of string ...

  9. MVC4 中Remote的使用

    相信当你看到这篇文章的时候对remote是有一些了解了, 起码知道这个东西是来干嘛用的. 这里也就不废话了 直接上代码  看看Remote的一些使用方式. 1.判断表单上输入的数据是否存在 [Syst ...

  10. C++程序原码

    直接插入排序基本算法 #include<iostream.h> #include<stdlib.h> #include<time.h> const int n=10 ...