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

1 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"111",@"222",@"333",nil];
2 NSMutableArray *array1 = [array copy];
3 NSMutableArray *array2 = array1;
4 NSLog(@"aray:%@,array1:%@,array2:%@",array,array1,array2);
5 [aray1 removeObjectAtIndex:1];
6 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"];这样应该可以。

转载于:https://www.cnblogs.com/A--G/p/4619583.html

【转】 NSArray copy 问题相关推荐

  1. ios nstimer实现延时_iOS 中常见 Crash 总结

    作者 | 在路上重名了啊 @(iOS总结)[温故而知新] [TOC] 1.找不到方法的实现unrecognized selector sent to instance 2.KVC造成的crash 3. ...

  2. Swift 在淘宝商品评价的技术重构与实践

    淘宝新版商品评价列表在经历一个半月的技术重构,几个月的迭代和放量,最终在 2021 年的双十一上,以 100% 的流量稳定的跑完了整个过程.我们不仅在业务上有了比较明确的提升,同时还沉淀了不少技术探索 ...

  3. Swift 在手淘商品评价的技术重构与实践

    作者:王浙剑(柘剑) 手淘新版商品评价列表在经历一个半月的技术重构,几个月的迭代和放量,最终在 2021 年的双十一上,以 100% 的流量稳定的跑完了整个过程.我们不仅在业务上有了比较明确的提升,同 ...

  4. Copy修饰的NSArray

    深复制与浅复制 简单点理解,深复制,在内存中拷贝一份新的对象. 浅复制,没有拷贝新的对象,只是一个地址的引用. 在赋值过程中深复制操作,原对象的引用计数不会增加,浅复制引用计数会加一. copy操作和 ...

  5. 关于NSArray使用时用strong修饰还是copy修饰问题测试

    大家都知道,使用NSMutableArray时是用strong修饰,例如: [objc] view plaincopy @property (nonatomic,strong) NSMutableAr ...

  6. 值类型 与引用的 copy

    结构体和枚举是值类型 值类型被赋予给一个变量,常数或者本身被传递给一个函数的时候,实际上操作的是其的拷贝. 在之前的章节中,我们已经大量使用了值类型.实际上,在 Swift 中,所有的基本类型:整数( ...

  7. copy, retain, assign , readonly , readwrite,strong,weak,nonatomic整理

    copy:建立一个索引计数为1的对象,然后释放旧对象 对NSString 对NSString 它指出,在赋值时使用传入值的一份拷贝.拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协 ...

  8. NSArray,NSSet,NSDictionary总结 (转)

    NSArray,NSSet,NSDictionary总结 博客分类: iphone 三种集合类来收集cocoa对象(NSObject对象): NSArray 用于对象有序集合(相当于是数组) NSSe ...

  9. 内存管理-定时器循环、内存布局、tagged pointer、weak指针、copy、自动释放池

    先上代码,我们平时用的定时器,cadisplaylink.nstimer,CADisplayLink.NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用 ...

最新文章

  1. python语言命令大全-python常用命令
  2. 6.项目资源管理总结
  3. 一次SYN***之战之Linux如何防SYN***
  4. 前端解读面向切面编程(AOP)
  5. $JavaScript(3)
  6. 持续定义SaaS模式云数据仓库+Serverless
  7. HDU 1754 I hate it【线段树之单点替换区间最值】
  8. Unity5 Survival Shooter开发笔记(1)
  9. Intro.js 分步向导插件使用方法
  10. JavaSE学习笔记-0225-ArrayList+案例
  11. android back键不退出程序,Android按back键不退出当前Activity
  12. 【文智背后的奥秘】系列篇——情感分类
  13. LeetCode-70. 爬楼梯(java)
  14. superset、metabase、redash、dataease开源BI对比
  15. JMockit、Mockito和Powermock介绍
  16. 百度地图聚合中的marker添加label后移动、放大缩小时label消失的问题download
  17. 宜信开源|Davinci:可视应用平台介绍与展望
  18. android 查询快捷方式,Android编程添加快捷方式(Short)到手机桌面的方法(含添加,删除及查询)...
  19. 超经典的20道SQL题目(附加解题思路)
  20. HTML5期末大作业:网站——个人网站介绍 (7页面带轮播特效)明星赵丽颖 学生DW网页设计作业源码 web课程设计网页规划与设计 大学生个人网站作业模板...

热门文章

  1. 关于AI Architecture未来的一些思考
  2. c语言二级考试基础知识,2018年计算机二级考试《C语言》考点:C语言基础知识...
  3. oracle1007错误,【问题处理】偶遇ORA- 01075: you are currently logged on错误
  4. php mysql博客构架_微博项目总结数据表
  5. 资深程序员才知道的30个Python技巧
  6. 决胜蓝桥杯python组-集合、字典
  7. string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类
  8. huffman图像编码C语言,Huffman编码的c语言实现
  9. 并发量,QPS,TPS,看这一篇就够了
  10. Linux 后台执行脚本或命令 nohup