无论如何在不使用alloc和后续版本的情况下将int(或float)数字转换为NSString对象?
int myInt = 25;
NSString *myString = [[NSString alloc] initWithFormat:@"%d",myInt];
...
[myString release];
编辑:
感谢您的回答,我应该在问题上更清楚一点,我特别感兴趣在iPhone上使用它。正如@chuck所说我可以使用一种方便的方法,但我的印象是我应该尽可能地避免这些因为内存/性能原因而在iPhone上使用。我可能错了。
加里
答案 0 :(得分:16)
如果没有在某些时候创建NSString,就无法创建它。但是你可以使用一个方便的构造函数,这样你就没有所有权的负担。
NSString *myString = [NSString stringWithFormat:@"%d", myInt];
它仍然会被创建和销毁(因为一切都必须如此),但你不必自己动手。
答案 1 :(得分:3)
NSString *mystring = [NSString stringWithFormat:@"Hello: %d",myint];
如果你以这种方式创建它应该是自动释放的
我认为惯例是除非你在方法名中看到单词init或alloc,否则它应该返回一个自动释放的对象。即,当应用程序进入生命周期的下一阶段时,对象将添加到当前自动释放池并刷新
答案 2 :(得分:3)
你想要
NSString *aStr=[[NSNumber numberWithInt:myInt] stringValue];
它返回一个自动释放的字符串。
答案 3 :(得分:3)
我可以使用一种方便的方法,但我的印象是,出于内存/性能的原因,我应尽可能避免在iPhone上使用这些方法。
“性能原因”是自动释放对象的成本。这曾经是iPhone的昂贵之处。 (我不知道它是否仍然存在。)唯一的选择是明确地分配它并自己释放它。正如其他人所指出的那样,如果没有分配它就不能拥有一个对象,并且如果不释放它就不能分配它。你需要以这种或那种方式发生这两件事。
记忆的原因很简单,一个自动释放的对象会持续更长时间,直到自动释放到期为止。自动释放许多对象,你的内存使用量会增加;将它堆得足够高,SpringBoard会告诉你的应用程序将其关闭(和/或只是杀死它)。解决方案是使对象不会持续这么长时间,这意味着(1)在已知的一批对象周围创建和排出自己的自动释放池,或者(2)自己管理对象的生命周期(即,分配和释放它们)
后一个原因不是特定于iPhone - 它也影响了Mac,虽然我们的上限更高:Macs有更多的短期内存,加上虚拟内存,所以我们可以侥幸使用更多的内存。即便如此,我们的Mac程序员也应该尽量不浪费内存,部分原因是因为分页地狱破坏了一天,部分原因是如果我们的应用程序在活动监视器列表中位置过高,我们将从用户那里获取电子邮件。
答案 4 :(得分:1)
您可以使用NSMutableString(-appendFormat :)或标准C字符串。但是,从根本上说,不,你将不得不在某处分配内存。
答案 5 :(得分:0)
为什么不定义宏...像
#define intString(i1) [[[NSString alloc] initWithFormat:@"%d",i1] autorelease];
将它放在前缀标题中。
答案 6 :(得分:0)
大部分时间autorelease
对您应用的总体内存使用量没有任何影响。如果您正在累积许多对象实例,则只需要关注自动释放。例如:
for (int i = 0; i < 1000; ++i)
{
NSString* s = [NSString stringWithFormat:@"%d", i];
...
}
该示例将在释放任何内容之前累积至少1000个不同的字符串实例,这是不可取的。在这种情况下,你会寻找其他选择。
如果您想避免创建一堆字符串实例,可以使用NSMutableString
:
NSMutableString* s = [NSMutableString stringWithCapacity:20];
[s appendFormat:@"%d", 123];
...
[s setString:@""];
[s appendFormat:@"%d", 456];
...
这是否比简单地创建和释放单独的字符串实例更快是有问题的,但是这种模式可能更适合您在代码中尝试完成的内容。