【转】 NSArray copy 问题
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,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 问题的更多相关文章
- Objective-C中的Strong、Copy与MutableCopy
面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...
- 对copy、mutableCopy理解
Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...
- 01-Foundation简介、NSObject、copy、NSString
目录: 一.Foundation常用类 二.Foundation简介 三.NSObject 四.NSString 回到顶部 一.Foundation常用类 1 NSObject.NSString.NS ...
- HEC-ResSim原文档
HEC-ResSim Reservoir System Simulation User's Manual Version 3.1 May 201 ...
- NSArray和NSMutableArray的copy和MutableCopy
NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...
- 给NSMutableArray添加copy属性就变成了NSArray
-copy, as implemented by mutable Cocoa classes, always returns their immutable counterparts. Thus, w ...
- [bugfix]copy属性参数将NSMutableArray变为NSArray类型
问题:NSMutableArray 声明为 copy 属性参数后即使接受NSMutableArray变量依然为NSArray变量 测试: 属性申明为: 1 @property (nonatomic, ...
- 用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本. 如果我们使用是 str ...
- --NSArray与NSMutableArray用copy修饰还是strong(转)
一.NSMutableArray 被copy.strong修饰后的变化: 把NSMutableArray用copy修饰有时就会crash,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变 ...
随机推荐
- 【Java】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
- Cow Exhibition
poj2184:http://poj.org/problem?id=2184 题意:给你n头牛,每头牛有一个S值和一个F值,现在的问题是,要你选出其中的一些牛求出S+T的最大值.但是要保证总的s> ...
- HTML入门教程(全套)
http://www.rm5u.com/html_html.html http://learn.shayhowe.com/ moe.mwulu.com http://www.w3school.co ...
- 使用 Java 开发兼容 IPv6 的网络应用程序
根据现有 IPv4 地址的部署速度,剩余的地址将在 10 到 20 年被使用殆尽.因此网络逐渐从 IPv4 向 IPv6 转换是不可避免的,相应的各种网络应用程序都将支持 IPv6.对于 Java,从 ...
- joelonsoftware 读书摘录
joelonsoftware 读书摘录 <五个为什么> 1.“黑天鹅难题”,代表外来因素,是一个超出正常预料之外的事件. 2.丰田佐吉的“五个为什么”,当某个地方出现问题时,你就一 ...
- 【转】深入了解android平台的jni---注册native函数
原文网址:http://my.oschina.net/u/157503/blog/169041 注册native函数有两种方法:静态注册和动态注册. 1.静态注册方法 根据函数名找到对应的JNI函数: ...
- Codeforces 716B Complete the Word【模拟】 (Codeforces Round #372 (Div. 2))
B. Complete the Word time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- QQ互联 回调地址
http://wiki.connect.qq.com/%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98% ...
- linux内网机器访问外网代理设置squid
公司一般出于安全考虑, 在同一局域网中只有一台机器可以访问外网,运维进行了整体的限制, 但是在后面的工作中,需要在机器上安装一些软件,及命令,所以其他的机器需要访问外网来简化工作, 但又不能打乱原有运 ...
- [置顶] Ubuntu 12.04以上如何恢复GNOME传统界面
Ubuntu 12.04以上开始使用Unity作为界面系统了,对于一直以来使用GNOME界面的人来说太不适应了,以下是如何在Ubuntu 12.04上恢复GNOME桌面 打开Linux终端上输入以下命 ...
转自: