首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSString上的stringWithFormat与initWithFormat

NSString上的stringWithFormat与initWithFormat
EN

Stack Overflow用户
提问于 2010-10-10 12:06:08
回答 2查看 18.3K关注 0票数 21

我想知道以这种方式声明NSString有什么不同,比如缺点和/或优点:

代码语言:javascript
复制
NSString *noInit = [NSString stringWithFormat:@"lolcatz %d", i];

与此相对的是:

代码语言:javascript
复制
NSString *withInit = [[NSString alloc] initWithFormat:@"Hai %d", i];

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-10 12:08:50

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

票数 37
EN

Stack Overflow用户

发布于 2011-11-30 04:14:32

实际上,就在昨天,我遇到了关于内存优化的this blog条目。在这篇文章中,作者给出了他选择使用[[NSString alloc] initWithFormat:@"..."]而不是[NSString stringWithFormat:@"..."]的具体原因。具体地说,如果您创建一个自动释放对象,iOS设备可能不会像您希望的那样自动释放内存池。

以前的版本要求您在如下结构中手动release它:

代码语言:javascript
复制
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只是暂时需要的,因此为了避免自动释放(在程序中可能会发生很长一段时间),我显式地在需要的时候处理内存。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3898974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档