代码之家  ›  专栏  ›  技术社区  ›  Krumelur

nsstring:如何在循环中使用子字符串?

  •  0
  • Krumelur  · 技术社区  · 15 年前

    stext是nsstring类型的实例变量。不涉及任何属性。

    下面的循环应该获取stext的第一个字符,并将该字符存储在scurrentcharacter中。然后,应将stext的其余部分重新分配给stext。这一直持续到绳子被吃光为止。 (我遗漏了所有对变量有意义的代码)。

    while ([sText length] > 0)
    {
    // Get the current first ASCII character.
    NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
    // Keep everything but the first character.
    sText = [sText substringFromIndex:1];
    }
    

    问题:在重新分配“substringfromindex”的结果之前,是否必须释放stext?如果是的话:为什么?如果不是:为什么不是?-)

    仁和

    2 回复  |  直到 15 年前
        1
  •  3
  •   Elfred    15 年前

    这取决于你是如何创建初始的 sText . 如果 STEXT 是一个自动释放的对象,或者您没有明确地保留它,那么您就可以了。如果使用 init , copy retain 你应该在while循环之前自动释放它。

    所以这很好:

    NSString *sText = @"foo";
    while ([sText length] > 0){
       // Get the current first ASCII character.
       NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
      // Keep everything but the first character.
      sText = [sText substringFromIndex:1];
    }
    

    这将泄漏原始值 STEXT :

    NSString *sText = [myString retain];
    while ([sText length] > 0){
       // Get the current first ASCII character.
       NSString *sCurrentCharacter = [sMorseText substringToIndex:1];
      // Keep everything but the first character.
      sText = [sText substringFromIndex:1];
    }
    
        2
  •  0
  •   Jens Ayton    15 年前

    撇开内存管理问题不谈,这在Objective-C中是一种效率相当低的方法(但对Lisp来说很好!)更有效的方法是:

    NSUInteger iter, length = sText.length; // Only call -length once.
    for (iter = 0; iter < length; iter++)
    {
        unichar c = [sText characterAtIndex:iter];
        // Or, if you actually need it as an NSString:
        NSString *substr = [sText substringWithRange:(NSRange){ iter, 1 }];
    }