【问题标题】:Memory / Obj-C proper object release. Which of these requires release?内存/Obj-C 适当的对象释放。其中哪些需要释放?
【发布时间】:2010-07-22 09:09:46
【问题描述】:

好的,这是一个基本问题,但我之所以这么问,是因为我真的不明白如何正确管理这个问题。如果我取消注释最后两行,这段代码会崩溃,尽管我认为它不应该这样做。

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

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

【问题讨论】:

  • 我强烈建议您从“构建”菜单中执行“构建和分析”。它将准确地突出显示您过度/不足发布的内容。

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


【解决方案1】:

仅在 setTextFromFloat: 方法的末尾释放格式化程序。

因为你的类继承自UILabel,所以self.textUILabel类的一部分,会在UILabeldealloc方法中释放,所以你不必自己释放在您的子类的 dealloc 方法中,您调用 [super dealloc]

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

【讨论】:

    【解决方案2】:

    所以,这里有三个我很困惑的对象:

    a) self.text(旧字符串值) - 什么时候发布?调用这个函数时是否应该释放 self.text 的旧内容?

    self.text 不是一个对象,它是一个属性,这意味着它是一对访问器 -text-setText: 如果它有一个实例变量支持它并且它具有保留或复制语义,则必须释放-dealloc 中的实例变量。

    b) 格式化程序,我在这里分配的 NSNumberFormatter 几乎肯定需要释放

    不是“几乎肯定”而是“肯定”。

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

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

    【讨论】:

      【解决方案3】:

      numberString 不得释放。您通过便利构造函数获取它,因此它是自动释放的。

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

      【讨论】:

        猜你喜欢
        • 2011-11-13
        • 1970-01-01
        • 1970-01-01
        • 2023-01-05
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多