2010-07-22 76 views
0

好的,这是一个基本的问题,但我问,因为我真的不明白如何正确管理这个。如果我取消注释最后两行,那么这段代码会崩溃,即使我认为它不应该。Memory/Obj-C正确的对象释放。哪些需要发布?

以下代码来自自定义的子类UILabel,其中我添加了以下方法setTextFromFloat。

-(void)setTextFromFloat:(float)newValue { 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init]; 
[formatter setMaximumFractionDigits:2]; 
[formatter setRoundingMode:NSNumberFormatterRoundUp]; 

NSString *numberString = [formatter stringFromNumber:[NSNumber numberWithFloat:newValue]]; 
NSString *newLabelValue = [numberString stringByAppendingString:@"x"]; 
self.text = newLabelValue; 
//[numberString release]; 
//[formatter release]; 
} 

所以,这里有三个对象,我感到困惑:

一)self.text(旧的字符串值) - 当这种释放?当我调用这个函数时,我应该释放self.text的旧内容吗?

B)格式,我alloc'd这里NSNumberFormatter几乎肯定需要释放

三)怎么样numberString?我只是用它作为中介来构建newLabelValue。如果我释放它,我相信该程序崩溃,但为什么?我不负责通过调用stringFromNumber间接使用的内存?

非常感谢任何智慧,谢谢!

+0

我强烈建议您从Build菜单中执行“Build and Analyze”。它将突出显示您正在释放/释放的内容。 – BarrettJ 2010-07-22 14:01:59

回答

0

numberString不得释放。你通过一个方便的构造函数获得它,所以它是自动发布的。

关于你的self.text属性,如果你还没有声明它,你不负责任。否则,它需要在dealloc方法中发布。

1

只在您的setTextFromFloat:方法结束时释放格式化程序。

因为你的类继承自UILabelself.textUILabel类的一部分,将在UILabeldealloc方法来发布,所以你不必自己释放它,如果在你的子类的dealloc方法调用[super dealloc]

numberString正在使用NSString.stringFromNumber:创建,所以它已经设置为从内部方法中自动释放。不要手动释放它,否则你的程序会崩溃。

1

所以,这里有三个对象,我感到困惑:

一)self.text(旧的字符串值) - 当这种释放?当我调用这个函数时,我应该释放self.text的旧内容吗?

self.text是不是一个对象,它是一个属性,这意味着它是在一对存取-text-setText:如果有一个实例变量背衬它和它已经保留或复制的语义,则必须释放实例变量-dealloc

B)格式,我alloc'd这里NSNumberFormatter几乎肯定需要释放

不是 “几乎可以肯定”,但 “肯定”。

c)那么numberString呢?我只是用它作为中介来构建newLabelValue。如果我释放它,我相信该程序崩溃,但为什么?我不负责通过调用stringFromNumber间接使用的内存?

查看Cocoa Memory Management rules。你是否通过new,alloc或者包含copy的方法获得了numberString?不,你没有。你保留了吗?不,你没有。因此,你不能释放它,因为你不拥有它。如果你想拥有它,发送-retain它。然后,当你不再需要保留它时,你必须释放它。

相关问题