为什么不可变对象在Cocoa中有一个简单的内存管理?

为什么不可变对象在Cocoa中有一个简单的内存管理?,cocoa,memory-management,immutability,Cocoa,Memory Management,Immutability,在PaulHegarty的课程中,他建议出于内存管理的原因使用不可变对象。然而,我找不到原因 那么,出于内存管理的原因,为什么不可变对象更可取呢?根据我的经验,如果您知道如何正确管理内存,那么从技术上讲,它在内存管理方面并不是更好的。我的猜测是,他建议新的cocoa开发人员使用它,因为它将从本质上帮助他们避免处理内存的一些陷阱 例如,如果你有一个类,它有一个成员NSString*myString。。。然后,如果创建一个NSMutableString*mutable并设置A.myString=mu

在PaulHegarty的课程中,他建议出于内存管理的原因使用不可变对象。然而,我找不到原因


那么,出于内存管理的原因,为什么不可变对象更可取呢?

根据我的经验,如果您知道如何正确管理内存,那么从技术上讲,它在内存管理方面并不是更好的。我的猜测是,他建议新的cocoa开发人员使用它,因为它将从本质上帮助他们避免处理内存的一些陷阱

例如,如果你有一个类,它有一个成员NSString*myString。。。然后,如果创建一个NSMutableString*mutable并设置A.myString=mutable。。。。类的编写者希望myString不会改变,但是因为它实际上是可变的,所以它可以改变。因此,他可能会建议这样做,以便新开发人员避免自食其果


不过这只是一个猜测,我不知道为什么不可变的内存效率会更高。

主要原因是不可变对象的
copy
操作实际上是
retain
的别名(或者,对于垃圾收集,是no-op)。这是有效的,因为正确使用不可变对象时,除了通过指针比较外,无法观察原始对象和副本之间的差异

这一点很重要,因为“值对象”(如字符串)经常被复制,以避免出现Kenny Wyland所描述的情况。如果您声明了一个属性
@property(copy)NSString*foo
,则为其分配一个不可变的字符串将保留该属性,而不会产生太大的开销,而为其分配一个可变的字符串将复制该属性,以避免其在助理的背后更改