1

我需要在整个程序中使用一堆字符串变量。我经常重新分配其中一些,而另一些在执行过程中被困在相同的值上。这里的最佳做法是什么?

在第一种情况下,变量应该是NSMutableString并且我应该将它们转换为NSString(使用复制方法),只要它们需要成为需要NSString对象的函数的参数。那正确吗?

当我将它们重新分配给其他常量值时,我不应该处理以前的内容,对吧?

至于NSString对象,如果我需要为它们分配一个新值,我想我应该释放它们,重新分配它们,然后分配新值。那是对的吗?

4

3 回答 3

6

除非您实际修改字符串,否则不应使用NSMutableString. 您正在将整个字符串重新分配给一个新值,因此请使用常规的NSString. 使用自动发布的版本,因为这将比 alloc/init/release 更有效。如果您知道它们将被分配给什么,您也可以将您的字符串重新分配给常量。

在第一种情况下,变量应该是 NSMutableString 并且当它们需要作为需要 NSString 对象的函数的参数时,我应该将它们转换为 NSString(使用复制方法)。那正确吗?

好吧,你可以那样做,但它确实效率低下。记住继承——anNSMutableString an NSString,只是添加了一些新的东西。一个简单的演员就可以了:

NSString *string = (NSString *)aMutableString;

更好的是,您甚至不必这样做。由于继承,您可以在需要常规字符串的任何地方直接传入可变字符串,无需强制转换。这就是传承的美妙之处。

当我将它们重新分配给其他常量值时,我不应该处理以前的内容,对吧

对于不可变或不可变的字符串。旧值在内存中被简单地覆盖——在那里没有任何东西可以处理。就内存管理而言,一直在创建新字符串确实效率不高。只需重新分配它们。您将永远不需要多次alloc/一个字符串,并且该单曲应该由单曲平衡。initinitrelease

附录:什么时候应该使用 Mutable? 当您在物理上更改现有字符串的值时,应该使用可变字符串,而不是完全丢弃旧值。示例可能包括在开头或结尾添加一个字符,或者在中间更改一个字符。使用可变字符串,您可以“就地”执行此操作——您只需修改现有字符串。相比之下,不可变字符串一旦设置了值,就无法更改该值NSString具有诸如 之类的方法stringByAppendingString:,它确实将字符串添加到现有字符串中—<strong>但它返回一个新字符串。在幕后,NSString已将旧字符串复制到新的(更大的)内存位置,添加了参数并返回了新字符串。复制效率要低得多(相对而言,或者如果您必须经常这样做)。

当然,没有什么能阻止您将一个字符串物理分配给另一个字符串。旧值将被覆盖。大多数NSStrings,包括@"String Constants",都是自动发布的。如果您正在创建一个新字符串并决定分配/初始化,则可以将其分配给另一个值而不会产生任何后果:

myString = anotherString;
myString = myTextField.text;

您可以使用可变字符串和不可变字符串来执行此操作。主要的收获是你应该只在更改字符串本身时使用 mutable 。但是您可以使用可变字符串和不可变字符串更改变量,而不会出现编译器或运行时问题(缺少内存管理,但大部分都是自动释放的)。

于 2011-07-03T22:26:41.867 回答
1

As for NSString objects, if I need to assign a new value to them, I guess I should deallocate them, allocate them again, and then assign the new value. Is that correct?

You don't deallocate NSString if you didn't allocated it before, like here:

NSString *string = [NSString stringWithFormat:@"Hello"];

You only need to deallocate it when you call alloc:

NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
于 2011-07-03T22:16:48.463 回答
1

NSMutableString* 和 NSString* 之间的唯一区别是可变字符串可以更改。你不必强制转换任何东西,因为 NSMutableString 是 NSString 的子类,也不需要采取不同的内存措施(所以你是对的 * )。

如果您需要字符串的可修改版本,您只需执行

NSMutableString* myMutableString = [NSMutableString stringWithString:myString];

你不应该“复制”任何东西。

请注意,如果您致电:

NSString* myString = myMutableString;

myString 仍然是一个可变字符串。

因此,如果出于任何原因(安全...)您需要不可变的字符串,则必须调用

NSString* myString = [NSString stringWithString:myMutableString];

* 你是对的,但你也可以在可变字符串上调用 [replaceCharactersInRange:withString:] 。如果之前的分配有足够的空间,那么它可能会更快,因为没有销毁和新的分配要做。

(后来添加:忘记了 setString: 方法)

于 2011-07-03T22:27:35.473 回答