stringWithFormat与NSString上的initWithFormat

时间:2010-10-10 04:06:08

标签: objective-c nsstring

我想知道以这种方式声明NSString的缺点和/或优点之间存在哪些差异:

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

而不是:

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

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

2 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:3)

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