2010-08-27 160 views
0

走线内存管理

[angleLabelInRadians setText:[[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]]; 

当创建一个消息中一个NSString对象,我还需要释放此NSString的,如果是这样,我该怎么做,因为我的天堂没有创建一个指向对象的指针?

此外,这是正确的编码程序,还是这一行太长?将它分成以下形式会更好吗?

NSString *polyRad = [[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]; 
[angleLabelInRadians setText:polyRad]; 
[polyRad release]; 

回答

2

除非你身处一个没有自动释放池的环境,否则你通常只需要使用其中一个便利功能就可以完成上述任务。

[angleLabelInRadians setText:[[NSString stringWithFormat:@"%.3g", [poly angleInRadians]]; 

如果你不想使用自动释放,你就必须做

NSString *s = [[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]]; 
[angleLabelInRadians setText:s]; 
[s release]; 
2

有一个简单的规则:释放你用“init”或“new”创建的每个对象。在上面的示例中,您可以调用“autorelease”来释放字符串或静态初始化程序,如[NSString stringWithFormat:...] - 它在内部使用autorelease。

1

你有两个选择:

你suggered的一个:分三种说法。

我个人认为这比较好。只要看看这些树状线,你就清楚地知道你在做什么。目前还不清楚你想在一条线上做什么。 (但这是我个人的意见)

或者你总是可以像Grobra说和自动释放字符串。

使用舒适方法

[angleLabelInRadians setText:[NSString stringWithFormat:@"%.3g", [poly angleInRadians]]]; 

或者干脆自动释放该字符串

[angleLabelInRadians setText:[[[NSString alloc] initWithFormat:@"%.3g", [poly angleInRadians]] autorelease]]; 
+1

INIT +自动释放是完全一样的事情尽可能的方便方法,以便不知道为什么你会永远想这样做,当它有一个类的方法。 – Kalle 2010-08-29 16:12:20