我想知道以这种方式声明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.
实际上,我昨天刚看到这个关于内存优化的博客条目。在其中,作者给出了他选择使用[[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只是暂时需要,因此为了避免自动释放(这可能会在程序的后期发生),我在需要时明确处理内存。