【问题标题】:Instruments reporting false memory leaks?仪器报告虚假内存泄漏?
【发布时间】:2011-03-09 09:32:54
【问题描述】:

我在我的 iPad 应用上运行 Instruments 来检查泄漏。它发现了几个“泄漏”,其中一个对象被保留在一个方法中:

alt text http://cl.ly/a85d3d8bdc6286c8de71/content

但是这些对象是在dealloc后面释放的:

alt text http://cl.ly/a265f76a538ee55781df/content

这些是否被归类为误报?

【问题讨论】:

    标签: iphone cocoa-touch memory-management ipad instruments


    【解决方案1】:

    self.detailPopover 是不是用retain 声明的属性?如果是这样,那么赋值 self.detailPopover 将导致生成的 set 方法对您已经拥有的 alloc 返回的对象调用 retain。

    如果它是一个保留属性,则将 self 从赋值中删除,这样 set 方法就不会被调用,并且您的保留计数将是正确的。

    Property* prop = [[Property alloc] init]; // retain count == 1 
    self.property = prop; // retain count == 2 
    [prop release]; // retain count == 1 
    

    或避免生成的 set 方法,它的保留...

    property = [[Property alloc] init]; // retain count == 1 
    

    【讨论】:

    • 我有点困惑。我的印象是,每当您将对象分配给属性时,您都应该使用 self ,以确保它通过适当的设置器。
    • 一般来说是的,但是在类的实现中你需要小心。从 alloc 返回的任何对象都已归您所有,因此您可以在分配对象后调用 release 或直接分配给成员变量。
    • 谢谢,现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2012-07-06
    • 2011-02-15
    • 2010-11-26
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多