博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Objective-C中的Strong、Copy与MutableCopy
阅读量:6188 次
发布时间:2019-06-21

本文共 1881 字,大约阅读时间需要 6 分钟。

面试过程中经常被问到ARC中Strong、Copy的区别是什么。普通的回答是:一样。文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR)

可以先参考这篇文章http://www.cnblogs.com/lihaiyin/p/4647426.html

 

问题一:到底用Copy还是Strong

1. 把不可变对象写成Copy:   如果把不可变对象赋值给此属性,内存中其实就是retain了一下。 如果把可变对象赋值给此属性,会生成新的不可变对象,避免值的变化

2. 把不可变对象写成Strong: 如果把不可变对象赋值给此属性,内存中其实就是retain了一下。 如果把可变对象赋值给此属性,会导致赋值后的内容依然可变

3. 把可变对象写成Strong:   如果把不可变对象赋值给此属性,调用此对象的addXX等增、删的方法时会崩溃。如果把可变对象赋值给此属性,内存中其实就是retain了一下。

4. 把可变对象写成Copy:     无论是谁赋值给此属性,都会调用Copy生成不可变对象,都会在调用此对象的addXX等增、删的方法时会崩溃

 

因此,我们的代码中一般都会  把不可变对象写成Copy  把可变对象写成Strong

 

问题二:源码中的Copy方法为什么copyItem的参数是YES?

/** * Returns a new copy of the receiver.
* The default abstract implementation of a copy is to use the * -initWithArray:copyItems: method with the flag set to YES.
* Immutable subclasses generally simply retain and return the receiver. */- (id) copyWithZone: (NSZone*)zone{ NSArray *copy = [NSArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: YES];}/** * Returns an NSMutableArray instance containing the same objects as * the receiver.
* The default implementation does this by calling the * -initWithArray:copyItems: method on a newly created object, * and passing it NO to tell it just to retain the items. */- (id) mutableCopyWithZone: (NSZone*)zone{ NSMutableArray *copy = [NSMutableArrayClass allocWithZone: zone]; return [copy initWithArray: self copyItems: NO];}

对比一下,发现initWithArray:copyItems方法的参数很怪。都知道,无论NSArray是copy还是mutableCopy,item都是retain的,不会copy,那为啥copyWithZone方法(copy方法调用时会调用此方法)的实现中,copyItem的参数是YES?

-initWithArray:copyItems: method with the flag set to YES.
* Immutable subclasses generally simply retain and return the receiver

想了很久,后来发现,答案就在注释中,不可变子类(NSString、NSArray、NSDictionary)一般只是简单的retain。。。对不可变对象调用copy只是retain,对可变对象调用copy会生成不可变对象,所以,为了使得新生成的NSArray“不可变”(元素本身也要不可变),只能使用copy,但这里的copy并非为item生成了新的对象,只是为了生成“不可变”的对象

 

转载于:https://www.cnblogs.com/lihaiyin/p/5241754.html

你可能感兴趣的文章
vc6.0的一些快捷键
查看>>
OCP读书笔记(20) - 复制数据库
查看>>
0414复利计算5.1-美观、输入更新
查看>>
免费「模拟面试」福利反馈连载(20180128期)
查看>>
一起来玩Weex
查看>>
Istio Proxy【Envoy扩展】详解
查看>>
gRPC-Web发布,REST又要被干掉了?
查看>>
检查脚本
查看>>
Ubuntu 无法mount解决办法
查看>>
WPF 3D:简单的Point3D和Vector3D动画创造一个旋转的正方体
查看>>
《Spring 5官方文档》11集成测试 (二)
查看>>
MySQL不能使用/tmp
查看>>
深入理解 GraphQL
查看>>
自定义UICollectionViewFlowLayout
查看>>
CSS一些最佳实践
查看>>
爬虫利器初体验
查看>>
web.xml/servlet过滤器之压缩UrlRewriteFilter
查看>>
yum安装
查看>>
Oozie应用
查看>>
获取屏幕大小工具类
查看>>