NSMutableString作为保留/复制

时间:2011-02-14 17:34:14

标签: iphone objective-c cocoa-touch copy

我的应用程序中有很多NSMutableString(差不多10-11);全部定义为ivar / property

@property (nonatomic, retain) NSMutableString *str1;

我在某处读到,最好对字符串使用“copy”。真的吗?如果是,我可以在我的应用程序中替换retain复制并删除dealloc中的版本吗?

我还需要考虑其他一些事情吗?

此外,在1个应用程序中拥有10-11个NSMutableString是正常的。我的意思是从内存使用角度来看?我的应用程序中也有4-5个NSMutableDictionary。如果没问题,请告诉我。

3 个答案:

答案 0 :(得分:27)

虽然Taskinoor的答案是正确的,但我想补充一点解释。

建议对类是具有可变/不可变对的类集群的类使用副本;例如NSString / NSMutableString NSArray / NSMutableArray NSDictionary / NSMutableDictionary NSSet / NSMutableSet

这样做的原因是可以将一个属性声明为不可变类型(如NSString),然后将其传递给一个可变类型(如NSMutableString)。在这种情况下,可以像Taskinoor描述的那样在类外部更改属性。

建议使用copy,因为它对类集群有明显的行为。将copy发送到mutable类会返回该对象的不可变副本(即向copy发送NSMutableString消息会返回NSString)。但是,将copy发送给不可变对应方等同于向其发送retain消息。

答案 1 :(得分:27)

答案 2 :(得分:12)

对于可变字符串复制和保留有不同的结果。如果你将str1的副本复制到str2,那么对str1的任何更改都不会反映在str2中,并且str2中的任何更改都不会反映在str1中,因为它们是单独的对象。但是如果str1保留为str2,则两者都指向相同的可变字符串对象,并且通过str1的更改将反映在str2中。但NSString不可变。因此,对于简单的字符串(即,不是可变字符串),复制只是增加引用计数,这意味着它在内部被视为保留(我不是100%确定处理副本,如保留非可变对象,但看到这个所以在一些不同的问题上。谷歌搜索,我会编辑,如果我能找到链接。)。

如果你使用副本,那么你仍然需要在dealloc中释放它。

具有10 - 11个正常大小的字符串应该对内存使用没有负面影响。典型的应用程序可能包含更多字符串。按正常大小我的意思是你没有在字符串中附加100万个字符。那将是一个严重的问题。字符串占用的内存将随着字符串长度的增加而增加。字典也一样。字典占用的内存取决于您在字典中存储的内容。字典本身没有太多开销。您始终可以使用仪器检查应用的内存使用情况。