好吧,这是一个基本问题,但我问,因为我真的不明白如何妥善管理这个问题。如果我取消注释最后两行,这段代码会崩溃,即使我认为它不应该。
以下代码来自自定义子类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];
}
所以,这里有三个对象我很困惑:
a)self.text(旧字符串值) - 这是什么时候发布的?当我调用这个函数时,我应该释放self.text的旧内容吗?
b)格式化程序,我在这里分配的NSNumberFormatter几乎肯定需要发布
c)numberString怎么样?我只是用它作为构建newLabelValue的中介。如果我发布它我相信程序崩溃,但为什么?我不负责通过调用stringFromNumber间接使用的内存吗?
任何智慧都非常感谢,谢谢!
答案 0 :(得分:1)
仅在setTextFromFloat:
方法的末尾发布格式化程序。
由于您的类继承自UILabel
,self.text
是UILabel
类的一部分,将在UILabel
的{{1}}方法中发布,因此如果在您的子类dealloc
方法中调用dealloc
,则不必自行发布。
[super dealloc]
正在使用numberString
创建,因此已经设置为从内部方法中自动释放。不要手动释放它,否则程序会崩溃。
答案 1 :(得分:1)
所以,这里有三个对象我很困惑:
a)self.text(旧字符串值) - 这是什么时候发布的?当我调用这个函数时,我应该释放self.text的旧内容吗?
self.text不是一个对象,它是一个属性,这意味着它是一对访问器-text
和-setText:
如果它有一个实例变量支持它并且它具有保留或复制语义,您必须在-dealloc
。
b)格式化程序,我在这里分配的NSNumberFormatter几乎肯定需要发布
不是“几乎肯定”,而是“当然”。
c)numberString怎么样?我只是用它作为构建newLabelValue的中介。如果我发布它我相信程序崩溃,但为什么?我不负责通过调用stringFromNumber间接使用的内存吗?
查看Cocoa Memory Management rules。您是否通过new,alloc或包含副本的方法获取了numberString?不,你没有。你保留了吗?不,你没有。因此,您不能释放它,因为您不拥有它。如果您想拥有它,请发送-retain
。然后,当你不再需要保留它时,你必须释放它。
答案 2 :(得分:0)
numberString
。你通过一个方便的构造函数得到它,所以它是自动释放的。
关于你的self.text属性,如果你还没有声明它,你就不负责任了。否则,需要使用dealloc
方法释放它。