NSArray copy 问题

本文通过一个具体的代码示例解释了在iOS开发中,使用mutableCopy与copy方法的区别,尤其是在处理数组复制时的不同行为及其原因。


转载自:http://blog.sina.com.cn/s/blog_6b1e4a060102uz0i.html

我知道iOS中都是指针 也就是说 如果 有一个array ,然后申明一个 array1 = [array copy];那么array1和array是指向同一片内存的,所以当你改变array1 的内容,那么array 也就自然跟着变化了,于是乎便有了以下代码和出现的问题:


NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"111",@"222",@"333",nil];
NSMutableArray *array1 = [array copy];
NSMutableArray *array2 = array1;
NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
[aray1 removeObjectAtIndex:1];
NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);

按照我们的思路,那么第一次打印出应该全都是 111,222,333,没错,对的
那么第二次打印出什么呢?同样 我们也想着应该是 array 111,222,333, 而 array1 和 array2打印应该是 111,333,对吗?答案是 错的,为什么呢,因为程序运行到 [aray1removeObjectAtIndex:1];就报错了,那么报什么错呢,为什么会报错呢?

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

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

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

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


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


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值