除非您实际修改字符串,否则不应使用NSMutableString
. 您正在将整个字符串重新分配给一个新值,因此请使用常规的NSString
. 使用自动发布的版本,因为这将比 alloc/init/release 更有效。如果您知道它们将被分配给什么,您也可以将您的字符串重新分配给常量。
在第一种情况下,变量应该是 NSMutableString 并且当它们需要作为需要 NSString 对象的函数的参数时,我应该将它们转换为 NSString(使用复制方法)。那正确吗?
好吧,你可以那样做,但它确实效率低下。记住继承——anNSMutableString
是an NSString
,只是添加了一些新的东西。一个简单的演员就可以了:
NSString *string = (NSString *)aMutableString;
更好的是,您甚至不必这样做。由于继承,您可以在需要常规字符串的任何地方直接传入可变字符串,无需强制转换。这就是传承的美妙之处。
当我将它们重新分配给其他常量值时,我不应该处理以前的内容,对吧
对于不可变或不可变的字符串。旧值在内存中被简单地覆盖——在那里没有任何东西可以处理。就内存管理而言,一直在创建新字符串确实效率不高。只需重新分配它们。您将永远不需要多次alloc
/一个字符串,并且该单曲应该由单曲平衡。init
init
release
附录:什么时候应该使用 Mutable?
当您在物理上更改现有字符串的值时,应该使用可变字符串,而不是完全丢弃旧值。示例可能包括在开头或结尾添加一个字符,或者在中间更改一个字符。使用可变字符串,您可以“就地”执行此操作——您只需修改现有字符串。相比之下,不可变字符串一旦设置了值,就无法更改该值。NSString
具有诸如 之类的方法stringByAppendingString:
,它确实将字符串添加到现有字符串中—<strong>但它返回一个新字符串。在幕后,NSString
已将旧字符串复制到新的(更大的)内存位置,添加了参数并返回了新字符串。复制效率要低得多(相对而言,或者如果您必须经常这样做)。
当然,没有什么能阻止您将一个字符串物理分配给另一个字符串。旧值将被覆盖。大多数NSString
s,包括@"String Constants"
,都是自动发布的。如果您正在创建一个新字符串并决定分配/初始化,则可以将其分配给另一个值而不会产生任何后果:
myString = anotherString;
myString = myTextField.text;
您可以使用可变字符串和不可变字符串来执行此操作。主要的收获是你应该只在更改字符串本身时使用 mutable 。但是您可以使用可变字符串和不可变字符串更改变量,而不会出现编译器或运行时问题(缺少内存管理,但大部分都是自动释放的)。