int / float到NSString而不使用alloc?

时间:2010-01-25 21:17:49

标签: objective-c cocoa

无论如何在不使用alloc和后续版本的情况下将int(或float)数字转换为NSString对象?

int myInt = 25;
NSString *myString = [[NSString alloc] initWithFormat:@"%d",myInt];
... 
[myString release];

编辑:

感谢您的回答,我应该在问题上更清楚一点,我特别感兴趣在iPhone上使用它。正如@chuck所说我可以使用一种方便的方法,但我的印象是我应该尽可能地避免这些因为内存/性能原因而在iPhone上使用。我可能错了。

加里

7 个答案:

答案 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];
...

这是否比简单地创建和释放单独的字符串实例更快是有问题的,但是这种模式可能更适合您在代码中尝试完成的内容。