我想知道以这种方式声明NSString有什么不同,比如缺点和/或优点:
NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];与此相对的是:
NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];用stringWithFormat而不是用initWithFormat的方式来初始化字符串的动机是什么?
发布于 2010-10-10 12:08:50
stringWithFormat:返回自动释放的字符串;initWithFormat:返回必须由调用者释放的字符串。前者是一种所谓的“方便”方法,对于生命周期较短的字符串非常有用,因此调用者不必记得调用release。
发布于 2011-11-30 04:14:32
实际上,就在昨天,我遇到了关于内存优化的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只是暂时需要的,因此为了避免自动释放(在程序中可能会发生很长一段时间),我显式地在需要的时候处理内存。
https://stackoverflow.com/questions/3898974
复制相似问题