Objective c 在Objective C中使用NSString和NSMutableString对象

Objective c 在Objective C中使用NSString和NSMutableString对象,objective-c,cocoa-touch,nsstring,nsmutablestring,Objective C,Cocoa Touch,Nsstring,Nsmutablestring,我需要在整个程序中使用一组字符串变量。我经常重新分配其中的一些值,而其他值在执行过程中仍然保持不变。 这里的最佳实践是什么 在第一种情况下,变量应该是NSMutableString,我应该使用copy方法将它们转换为NSString,只要它们需要成为需要NSString对象的函数的参数。是这样吗 当我将它们重新分配给其他常量值时,我不必处理以前的内容,对吗 至于NSString对象,如果我需要为它们分配一个新值,我想我应该取消分配它们,再次分配它们,然后分配新值。对吗 至于NSString对象,

我需要在整个程序中使用一组字符串变量。我经常重新分配其中的一些值,而其他值在执行过程中仍然保持不变。 这里的最佳实践是什么

在第一种情况下,变量应该是NSMutableString,我应该使用copy方法将它们转换为NSString,只要它们需要成为需要NSString对象的函数的参数。是这样吗

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

至于NSString对象,如果我需要为它们分配一个新值,我想我应该取消分配它们,再次分配它们,然后分配新值。对吗

至于NSString对象,如果需要的话 我想我应该给它们分配一个新值 应该取消分配它们,分配它们 再次,然后指定新值。 对吗

如果以前未分配NSString,则不会取消分配NSString,如下所示:

NSString *string = [NSString stringWithFormat:@"Hello"];
您只需在调用alloc时解除分配它:

NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
至于NSString对象,如果需要的话 我想我应该给它们分配一个新值 应该取消分配它们,分配它们 再次,然后指定新值。 对吗

如果以前未分配NSString,则不会取消分配NSString,如下所示:

NSString *string = [NSString stringWithFormat:@"Hello"];
您只需在调用alloc时解除分配它:

NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];

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

在第一种情况下,变量应该是NSMutableString,我应该使用copy方法将它们转换为NSString,只要它们需要成为需要NSString对象的函数的参数。是这样吗

好吧,你可以这样做,但这将是非常低效的。记住继承NSMutableString是NSString,只是添加了一些新内容。一个简单的演员阵容就可以做到:

NSString *string = (NSString *)aMutableString;
更妙的是,你甚至不必这么做。由于继承,您可以在任何需要常规字符串的地方直接传入可变字符串,而无需强制转换。这就是继承之美

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

对于可变或不可变字符串。旧的值只是在内存中被覆盖,没有什么可处理的。就内存管理而言,一直创建新字符串实际上是没有效率的。只是重新分配他们。您永远不需要多次alloc/init一个字符串,并且单个init应该由单个发行版来平衡

附录:什么时候应该使用可变表? 当您实际更改现有字符串的值时,应该使用可变字符串,而不完全丢弃旧值。例子可能包括在开始或结束时添加字符,或者在中间改变字符。对于可变字符串,您可以就地执行此操作,只需修改现有字符串即可。相反,不可变字符串的值一旦设置,就无法更改该值。NSString具有stringByAppendingString:等方法,该方法会向现有字符串添加字符串,但会返回新字符串。在幕后,NSString将旧字符串复制到新的更大内存位置,添加参数并返回新字符串。相对而言,复制的效率要低得多,或者如果你不得不经常这样做的话

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

myString = anotherString;
myString = myTextField.text;

您可以使用可变字符串和不可变字符串来实现这一点。主要的收获是,只有在更改字符串本身时才应该使用mutable。但是,您可以使用可变字符串和不可变字符串更改变量,而无需编译器或运行时内存管理问题,但大多数变量都是自动释放的

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

在第一种情况下,变量应该是NSMutableString,我应该使用copy方法将它们转换为NSString,只要它们需要成为需要NSString对象的函数的参数。是这样吗

我们 LH:噢,你可以那样做,但是效率太低了。记住继承NSMutableString是NSString,只是添加了一些新内容。一个简单的演员阵容就可以做到:

NSString *string = (NSString *)aMutableString;
更妙的是,你甚至不必这么做。由于继承,您可以在任何需要常规字符串的地方直接传入可变字符串,而无需强制转换。这就是继承之美

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

对于可变或不可变字符串。旧的值只是在内存中被覆盖,没有什么可处理的。就内存管理而言,一直创建新字符串实际上是没有效率的。只是重新分配他们。您永远不需要多次alloc/init一个字符串,并且单个init应该由单个发行版来平衡

附录:什么时候应该使用可变表? 当您实际更改现有字符串的值时,应该使用可变字符串,而不完全丢弃旧值。例子可能包括在开始或结束时添加字符,或者在中间改变字符。对于可变字符串,您可以就地执行此操作,只需修改现有字符串即可。相反,不可变字符串的值一旦设置,就无法更改该值。NSString具有stringByAppendingString:等方法,该方法会向现有字符串添加字符串,但会返回新字符串。在幕后,NSString将旧字符串复制到新的更大内存位置,添加参数并返回新字符串。相对而言,复制的效率要低得多,或者如果你不得不经常这样做的话

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

myString = anotherString;
myString = myTextField.text;
您可以使用可变字符串和不可变字符串来实现这一点。主要的收获是,只有在更改字符串本身时才应该使用mutable。但是,您可以使用可变字符串和不可变字符串更改变量,而无需编译器或运行时内存管理问题,但大多数变量都是自动释放的

NSMutableString*和NSString*之间的唯一区别是可变字符串可以更改。 您不必强制转换任何内容,因为NSMutableString是NSString的一个子类,也不需要采取不同的内存度量,因此您是正确的*

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

NSMutableString*myMutableString=[nsmutablestringwithstring:myString]

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

请注意,如果您致电:

NSString* myString = myMutableString;
myString仍然是一个可变字符串

所以如果出于任何原因安全。。。你真的需要不可变的字符串,你必须调用

NSString* myString = [NSString stringWithString:myMutableString];
*您是对的,但是您也可以对可变字符串调用[ReplaceCharactersRange:withString:]。如果以前的分配有足够的空间,那么它可能会更快,因为不需要进行销毁和新的分配

后来添加:忘记了setString:method

NSMutableString*和NSString*之间的唯一区别是可变字符串可以更改。 您不必强制转换任何内容,因为NSMutableString是NSString的一个子类,也不需要采取不同的内存度量,因此您是正确的*

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

NSMutableString*myMutableString=[nsmutablestringwithstring:myString]

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

请注意,如果您致电:

NSString* myString = myMutableString;
myString仍然是一个可变字符串

所以如果出于任何原因安全。。。你真的需要不可变的字符串,你必须调用

NSString* myString = [NSString stringWithString:myMutableString];
*您是对的,但是您也可以对可变字符串调用[ReplaceCharactersRange:withString:]。如果以前的分配有足够的空间,那么它可能会更快,因为不需要进行销毁和新的分配


后来添加:忘记setString:method

…如果以前的分配有足够的空间,那么它可能会更快,因为没有破坏和新的分配要做,但你永远不会知道,除了探测RAM本身,这将有足够的开销抵消这条路线可能带来的任何好处。我只是猜测苹果,在OpenStep的这15年中,优化了它的NSString类。。。我做了一些测试,我想我是对的\r1-带较短字符串的字符串:0.402674 s 2-带较长字符串的字符串:0.387015 s 3-带较短字符串的设置字符串:0.152494 s 4-带较短字符串的替换字符范围:0.183790 s 5-带较长字符串的设置字符串:1.522077 s 6-带较长字符串的替换字符范围:0.829953 sI承认这不是简单的猜测。几年前,我测试了一个分形生成程序
g非常长并且不断变化的字符串-我同意你的观点,在一般情况下,收益是微不足道的。。。对不起,如果我们有点偏离了原来的主题。。干杯,嘘……算了吧。我很欣赏这些数字,我从来没有想到过。但是,是的,这只是十分之一秒的问题,尽管这比我预期的要大。处理600个字符串需要一分钟或更长的时间;不,不!你说得很对。我测试了100000个字符串,不是一个!!!我错误地删除了它,因为我在评论中没有足够的字符。。它之所以在分形、大字典处理或许多变化字符串游戏的快速刷新等应用程序中变得重要。。。再次欢呼…如果以前的分配有足够的空间,那么它可能会更快,因为没有破坏和新的分配要做,但你永远不会知道,除了探测RAM本身,这将有足够的开销抵消这条路线可能带来的任何好处。我只是猜测苹果,在这15年的OpenStep中,优化了它的NSString类。。。我做了一些测试,我想我是对的\r1-带较短字符串的字符串:0.402674 s 2-带较长字符串的字符串:0.387015 s 3-带较短字符串的设置字符串:0.152494 s 4-带较短字符串的替换字符范围:0.183790 s 5-带较长字符串的设置字符串:1.522077 s 6-带较长字符串的替换字符范围:0.829953 sI承认这不是简单的猜测。几年前,我测试了一个分形生成程序,使用非常长且不断变化的字符串-我同意你的观点,在一般情况下,增益是微不足道的。。。对不起,如果我们有点偏离了原来的主题。。干杯,嘘……算了吧。我很欣赏这些数字,我从来没有想到过。但是,是的,这只是十分之一秒的问题,尽管这比我预期的要大。处理600个字符串需要一分钟或更长的时间;不,不!你说得很对。我测试了100000个字符串,不是一个!!!我错误地删除了它,因为我在评论中没有足够的字符。。它之所以在分形、大字典处理或许多变化字符串游戏的快速刷新等应用程序中变得重要。。。再次干杯