Memory / Obj-C适当的对象释放。以下哪些需要发布?

时间:2010-07-22 09:09:47

标签: iphone objective-c xcode memory-management nsstring

好吧,这是一个基本问题,但我问,因为我真的不明白如何妥善管理这个问题。如果我取消注释最后两行,这段代码会崩溃,即使我认为它不应该。

以下代码来自自定义子类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间接使用的内存吗?

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

3 个答案:

答案 0 :(得分:1)

仅在setTextFromFloat:方法的末尾发布格式化程序。

由于您的类继承自UILabelself.textUILabel类的一部分,将在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方法释放它。