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

stringWithFormat与NSString上的initWithFormat

  •  17
  • thyrgle  · 技术社区  · 15 年前

    我想知道这样声明NSString有什么区别,比如缺点和/或优点:

    NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];
    

    与之相反:

    NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];
    

    为什么 stringWithFormat initWithFormat 初始化字符串的方法?

    2 回复  |  直到 15 年前
        1
  •  35
  •   mipadi    15 年前

    stringWithFormat: 返回自动删除的字符串; initWithFormat: 返回必须由调用方释放的字符串。前者是一个所谓的“方便”方法,对短期字符串很有用,因此调用者不必记住调用 release

        2
  •  3
  •   OnlineCop    14 年前

    this blog 就在昨天,关于内存优化的条目。其中,作者给出了他选择使用 [[NSString alloc] initWithFormat:@"..."] 而不是 [NSString stringWithFormat:@"..."] . 特别是,如果创建自动释放对象,iOS设备可能不会按照您的意愿尽快自动释放内存池。

    前一个版本要求您手动 release

    NSString *remainingStr = nil;
    if (remaining > 1)
        remainingStr = [[NSString alloc] initWithFormat:@"You have %d left to go!", remaining];
    else if (remaining == 1)
        remainingStr = [[NSString alloc] initWithString:@"You have 1 left to go!"];
    else
        remainingStr = [[NSString alloc] initWithString:@"You have them all!"];
    
    NSString *msg = [NSString stringWithFormat:@"Level complete! %@", remainingStr];
    
    [remainingStr release];
    
    [self displayMessage:msg];
    

    在这里, remainingStr