在这种情况下,NSMutableString是否比NSString更有效?

时间:2009-04-01 17:11:44

标签: iphone objective-c cocoa-touch

如果我以这种方式声明一个指针变量:

NSString *foo;

然后在我的代码中的某个地方执行以下操作:

foo = @"bar";

这最终是我的NSString,在内存中创建一个带有附加字符串的新副本,然后删除我的初始字符串?作为NSMutableString,foo会更好吗?

2 个答案:

答案 0 :(得分:9)

不,foo是变量,持有指向NSString的指针。赋值foo = @"bar"将指针foo存储的值设置为NSString @"bar"的地址。没有副本。如果foo已指向其他NSString实例不是字符串constsant(例如@"bar")并且没有对该实例的其他引用,则你有内存泄漏。你会

[foo release];
foo = @"bar";

在那种情况下。您不需要保留或释放字符串常量,如@"bar"

字符串常量不能变异,因此如果尝试修改常量字符串的值,则会出现运行时错误。将@"bar"分配给NSString*NSMutableString*之间没有区别。当然,如果没有运行时错误,您将无法使用NSMutableString的变异方法,因为您将@“bar”(NSString实例)的地址分配给{{1}类型的变量}。如果你想改变字符串,你会做

NSMutableString*

在这种情况下,显然会制作副本,并且您负责在完成后发布NSMutableString *mutableFoo = [@"bar" mutableCopy];

答案 1 :(得分:5)

没有。示例中的@“bar”是一个字符串常量,应该存入代码中。您不需要担心使用此常量进行内存分配/释放。

当您对字符串进行大量的小操作(附加子字符串等)时,NSMutableString的使用效率更高,并且您不希望在整个地方继续分配自动释放的NSStrings。如果可以的话,我倾向于避免在iPhone上使用自动释放的字符串,因为循环中存在内存问题。