我的应用程序中有很多NSMutableString(差不多10-11);全部定义为ivar / property
@property (nonatomic, retain) NSMutableString *str1;
我在某处读到,最好对字符串使用“copy”。真的吗?如果是,我可以在我的应用程序中替换retain复制并删除dealloc中的版本吗?
我还需要考虑其他一些事情吗?
此外,在1个应用程序中拥有10-11个NSMutableString是正常的。我的意思是从内存使用角度来看?我的应用程序中也有4-5个NSMutableDictionary。如果没问题,请告诉我。
答案 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万个字符。那将是一个严重的问题。字符串占用的内存将随着字符串长度的增加而增加。字典也一样。字典占用的内存取决于您在字典中存储的内容。字典本身没有太多开销。您始终可以使用仪器检查应用的内存使用情况。