代码之家  ›  专栏  ›  技术社区  ›  Gary Willoughby

在obj-c中,如何用新的格式化字符串更新现有nsstring变量?

  •  1
  • Gary Willoughby  · 技术社区  · 14 年前

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

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

    String1 = [NSString new];
    

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

    我可以使用 initWithFormat: 消息,但这对已实例化的对象不可用。

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   Chuck    14 年前

    两种选择:

    1. 每次使用 [[NSString alloc] initWithFormat:@"whatever"] 把它赋给变量。(确保您遵循 memory management rules ,其中包括确保释放字符串的前一个值。当然,无论您如何处理这个问题,您都需要遵守这些规则。)

    2. 创建一个 NSMutableString 并使用可变方法更新字符串( appendFormat: , setString: , deleteCharactersInRange: 等)。在本例中,您不仅要更新变量,还要更新字符串本身。

    我个人会使用方法1,每次创建一个新的nsstring。这样我就不必去处理变异,只需创建一个具有我想要的精确值的字符串。

        2
  •  3
  •   Jack    14 年前

    可可中的弦是 不变的 物体。

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

    当然这不是问题,因为你会 NSString* 将指向上次更新的字符串的引用。

    NSString myString = [NSString stringWithFormat:...];
    
    // do whatever
    
    myString = [NSString stringWithFormat:..]
    
        3
  •  0
  •   Yuji    14 年前

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

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

     NSString* myString = [NSString stringWithFormat:...];
    
     // do whatever
    
     NSString*myString2 = [NSString stringWithFormat:...];
    

    另一件事是 new 在客观C世界中应用不广泛。如果你使用它,因为它听起来很熟悉C++背景等,请考虑使用 [[Class alloc] initWith...] 相反。

        4
  •  0
  •   mdizzle    14 年前

    要做的最简单的事情就是始终使用“工厂”方法,为您提供一个自动释放的不可变对象。实际上,只要创建一个包含一些静态文本的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的不可变字符串。您不需要担心释放或分配它们。