stringWithFormat与NSString上的initWithFormat

17 objective-c nsstring

我想知道以这种方式声明NSString的缺点和/或优点有什么区别:

NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];
Run Code Online (Sandbox Code Playgroud)

而不是:

NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];
Run Code Online (Sandbox Code Playgroud)

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

mip*_*adi 33

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

  • 其实; 它是`+ alloc`返回保留的实例...`init*`不会改变保留计数(但在这种情况下它可能会返回一个不同于被调用的实例). (2认同)

Onl*_*Cop 5

实际上,我昨天刚看到这个关于内存优化的博客条目。在其中,作者给出了他选择使用[[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];
Run Code Online (Sandbox Code Playgroud)

在这里,remainingStr只是暂时需要,因此为了避免自动释放(这可能会在程序的后期发生),我在需要时明确处理内存。