4

我对字符串的使用NSString感到困惑。NSMutable假设我在类中声明了实例变量一和二,如下所示:

NSString *one;
NSMutableString *two;

让我们假设我已经使用属性创建了它们的 setter 和 getter。

假设我已经改变了我的“两个”字符串,如下所示:

     1. [two appendString:@"more string"];
     2. two = @"string"
     3. self.two = @"string"

问题:

  1. 第一行会释放先前的字符串并分配新对象并为其赋值。如果是,那么这是否意味着在这种情况下创建 getter 和 setter 是不必要的?或者它没有必要在NSMutablestring

  2. 在这种情况下,之前分配的字符串对象会被释放吗?

  3. 可以肯定的是,当我们在这里调用 setter 时,第一个对象会被释放。这段代码是否必要,或者我们可以使用代码行 2 来分配字符串。

现在关于NSString:也可以像这样修改字符串:

    one = [one stringByAppendingString:@" more string"];
    self.one = [one stringByAppendingString:@" more string"];

哪个更好用NSMutablestringor NSString

对不起,很长的帖子,但我需要了解这些概念。

4

5 回答 5

3

对于您问题的第一部分:

  1. 几乎绝对不是。我希望内存将被动态分配,而不是释放和重新分配。

  2. 如果前面的答案是否定的,那么这也是否定的。

  3. 第二个和第三个选项甚至不适用于警告Incompatible pointer types assigning NSMutableString to NSString

我希望NSMutableString在内存方面会稍微更有效,因为您在早期就表明程序可能需要动态内存。NSString可能会被分配一个大小合适的内存块。

您的观点NSMutableString似乎是stringBy..NSString 的方法会做什么:

使用NSString及其stringBy...方法,您正在创建新对象,释放旧对象(如果需要)并使新对象自动释放。(如果您从非自动释放更改为自动释放,请注意,您的 dealloc 中可能有一个不再需要的释放)

于 2012-06-15T11:23:30.587 回答
3

NSString 是一个不可变的字符串对象,这意味着,在初始化之后,您无法更改它,NSMutableString 是可变的,这意味着您可以将另一个字符串附加到它或进行其他修改。

当你这样做时[two appendString:@"more string"],指针仍然指向内存中的相同位置,你不必担心分配或释放。

当你这样做时two = @"string",这意味着你让你的字符串指针指向内存中的特定位置,该位置包含内部带有值“string”的静态字符串。

当你这样做时self.two = @"string",你已经声明了一个名为 two 的属性。通过在 xcode 中使用属性,您不必担心内存,因为您已经在属性声明中指定了。这是 xcode 提供给你的一个很好的工具,你绝对应该尽可能地使用它。

于 2012-06-15T18:51:17.907 回答
2

NSMutableString将节省一些内存,因为NSString对象始终是常量。因此,将新值重新分配给NSString变量将为新字符串分配新内存。

但是,请注意您的代码中的一些错误。在向对象发送消息之前,您必须初始化对象:

// this won't work
NSString *one; 
[one stringByAppendingString:@"more string"];

// nor this
NSMutableString *two;
[two appendString:@"more string"];

// first do this: 
NSString *one = @"an initial string constant"; // or
NSString *one = [NSString string]; 

NSMutableString *two = [NSMutableString string]; 
于 2012-06-15T11:36:20.640 回答
2

NSString对象是不可变的,这意味着当您“修改” a 时,NSString您实际上是在创建一个新字符串而不是修改旧字符串,这不是很有效。随着NSMutableString字符串保存在缓冲区中,可以修改。

所以简单的规则是,如果您需要以任何方式修改字符串,请使用 a NSMutableStringand if not NSString。您也可以将 aNSMutableString转换为 aNSString但不能反过来(然后您需要制作副本)

于 2012-06-15T11:46:43.817 回答
0

NSMutableString 和 NSString 的区别在于:

NSMutableString:NSMutableString 对象提供了修改它们所代表的底层字符数组的方法,而 NSString 没有。例如,NSMutableString 公开了 appendString、deleteCharactersInRange、insertString、replaceOccurencesWithString 等方法。所有这些方法都对存在于内存中的字符串进行操作。我们可以在运行时更改字符串对象的值。

NSString:另一方面,如果你愿意,它只是一个创建一次然后只读的字符串;您会发现它的所有“操作”方法(子字符串、大写字符串等)都返回其他 NSString 对象,并且从未实际修改内存中的现有字符串。

于 2013-09-07T09:15:17.970 回答