在Obj-C中如何使用新的格式化字符串更新现有的NSString变量?

时间:2010-07-01 00:36:47

标签: objective-c nsstring

如何使用新的格式化字符串更新现有的NSString变量?

例如我有一个这样的变量:

String1 = [NSString new];

我希望使用标准printf格式使用新的格式化内容不时更新此字符串对象。

我可以使用initWithFormat:消息初始化新的NSString,但这对于已经实例化的对象是不可用的。

有什么想法吗?我想我每次都可以销毁NSString并重新初始化一个新的NSString,但每次我需要更新它时这是正确的解决方案吗?

4 个答案:

答案 0 :(得分:5)

两个选项:

  1. 每次使用[[NSString alloc] initWithFormat:@"whatever"]创建一个新字符串,并将其分配给变量。 (确保你遵循memory management rules,其中包括确保释放字符串的先前值。当然,无论你如何解决这个问题,你都需要遵循这些规则。)

  2. 创建NSMutableString并使用变异方法(appendFormat:setString:deleteCharactersInRange:等)更新字符串。在这种情况下,您不仅要更新变量,还要更新字符串本身。

  3. 就个人而言,我会使用方法1,每次都创建一个新的NSString。这样我就不必调整变异,只需创建一个具有我想要的精确值的字符串。

答案 1 :(得分:3)

Cocoa中的字符串是不可变的对象。

这意味着您不会更改相同的字符串,但您只需释放旧字符串并为新的NString分配更新后的内容。

当然这不是问题,因为您将有NSString*引用指向最后更新的字符串。

NSString myString = [NSString stringWithFormat:...];

// do whatever

myString = [NSString stringWithFormat:..]

答案 2 :(得分:0)

初始化后可以修改NSMutableString。您可以使用appendStringWithFormat:添加格式化字符串。但是如果你想要替换整个字符串,只需创建另一个字符串。它不会花费太多时间和资源。

这取决于品味,但我反对像Jack建议的那样重新使用变量。它常常让我困惑,我更喜欢在创建新字符串时创建一个新的变量名,如

 NSString* myString = [NSString stringWithFormat:...];

 // do whatever

 NSString*myString2 = [NSString stringWithFormat:...];

另一件事是new在Objective-C世界中没有被广泛使用。如果您使用它,因为它听起来很熟悉您的C ++背景等,请考虑使用[[Class alloc] initWith...]代替。

答案 3 :(得分:0)

最简单的方法就是始终使用“工厂”方法为您提供自动释放的不可变对象。实际上,每当你创建一个包含一些静态文本的NSString时,你基本上都会这样做。

例如:

NSString *myString = @"myString";
myString = [NSString stringWithFormat:@"myStringWithFormat"]; // Update it to something else
myString = [NSString stringWithFormat:@"The current date is: %@", [NSDate now]]; // Update it again

以上所有三个示例都是不可变的字符串,其集合引用计数为0.您无需担心释放或分配它们。