按理说,这都 9102 年了,还讨论这种问题,实在不太合适。可是最近在一些技术群里,却因这个问题炸开了锅,双方各执一词,谁也说服不了谁。那么,声明 NSString 类型的属性,到底用 strong 还是 copy 呢?我们看看下面这个故事:
小张写了个库,里面有这样一段代码:
有一天,小王用到了这个库。
小王:小张啊,你这个库有问题。
小张:什么问题啊?
小王:你把 name 属性声明成 strong 了,应该用 copy 的![偷笑]
小张:为什么应该用 copy 啊?
小王:你看这段代码,我修改了 mStr 的值, 但是 tom.name 的值也发生了改变!
小张:恩,是改变了。这样有什么问题呢?
小王:还看不出问题吗!我是不希望 tom.name 的值改变的,但现在却改变了!
小张:是你自己修改的啊。如果你不希望它的值改变,为什么要修改它呢?
小王:你把 name 属性声明成 copy 不就不会改变了吗!
小张:可我怎么知道你要不要改变呢?这个值要不要改变是你控制的啊!我在库的内部只做读取操作,并没有做修改操作。
小王:总之现在出了问题,这就是你的问题!
小张:你自己创建的可变对象,然后你自己把它的值改变了,为什么是我的问题啊?
小王:你的意思是我甩锅?
一场大战......
这时,小李走了过来,了解情况后
小李:小王啊,你的代码为什么要这么写啊?
小王:为什么不能这么写?
小李:作为程序员,我们一定要清楚自己的代码发生了什么!你这段代码,从逻辑层面讲,类似于下面这样
小王:这怎么一样呢?一个重新赋值,一个没有!
小李:重新赋值是将指针指向了新的内存空间,而你修改可变对象 mStr 的内容是直接更改原有内存空间的内容,都是修改内容,只是方式不一样而已。最重要的是,这块内存是你(调用方)申请的,本着“谁申请,谁管理”的原则,这块内存的内容是否修改也应该是你(调用方)来管理的。
感慨:遇事自己思考,反对教条主义、本本主义。