【问题标题】:stringWithFormat vs. initWithFormat on NSStringNSString 上的 stringWithFormat 与 initWithFormat
【发布时间】:2010-10-10 04:06:08
【问题描述】:

我想知道以这种方式声明 NSString 有哪些不同之处,例如缺点和/或优点:

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

相对于:

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

使用stringWithFormat 而不是仅仅使用initWithFormat 初始化字符串的动机是什么?

【问题讨论】:

    标签: objective-c nsstring


    【解决方案1】:

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

    【讨论】:

    • 以 32 秒的优势被击败。 :-)
    • 其实;是 +alloc 返回保留的实例...... init* 不会更改保留计数(但它可能 - 在这种情况下 - 返回与调用不同的实例)。
    【解决方案2】:

    实际上,就在昨天,我遇到了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 只是暂时需要的,因此为了避免自动释放(可能在程序的稍后部分发生),我会根据需要显式处理内存。

    【讨论】:

    • 它是在过早优化和清晰简洁代码之间的选择。过早的优化可以稍后通过分析性能来解决,不清楚的代码(通常)是永远的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多