我想知道以这种方式声明NSString的缺点和/或优点之间存在哪些差异:
NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];
而不是:
NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];
使用stringWithFormat
而不是仅使用initWithFormat
方式初始化字符串的动机是什么?
答案 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
只是暂时需要,所以为了避免自动释放(可能会在程序中稍后发生),我会根据需要显式处理内存。