【问题标题】:How to fix memory leaks for an autoreleased object如何修复自动释放对象的内存泄漏
【发布时间】:2012-06-13 04:29:04
【问题描述】:

我有这个方法会泄漏 ~ 6KB :

+ (EInspectorFacilityInfo*) newWithNode: (CXMLNode*) node
{
  if(node == nil) { return nil; }
  return (EInspectorFacilityInfo*)[[[EInspectorFacilityInfo alloc] initWithNode: node] autorelease];
}

这是一个屏幕截图,表明仪器中的内存泄漏。

我怎样才能摆脱这种内存泄漏?

【问题讨论】:

  • 重命名你的方法。按照惯例,以new 开头的方法会返回未自动释放的对象。也许这就是原因。
  • 请告诉我们你是如何调用这个方法的。
  • EInspectorFacilityInfo 类呢?如果您不释放它管理的对象,可能泄漏可能在其中。你不需要投射。
  • 嗯,除了命名约定之外,只有这种方法没有问题。您可能在其他地方泄漏。这就是为什么重要的是你要更多地关注你是如何调用这个方法的,你对返回的对象做了什么。除非您向我们展示这些代码,否则我们无法知道您泄漏的原因。
  • taskinoor 是正确的。 Instruments 向您展示了一个已泄漏的对象被分配到哪里,但这并不意味着它就是在哪里泄漏的。仪器无法确定。在泄漏列表中,您可以找到特定的泄漏对象,Instruments 可以向您显示其保留和释放的整个历史记录。您必须仔细查看这些代码,看看哪些代码未能平衡其保留与发布。此外,进行构建和分析并修复所有已识别的问题。

标签: iphone objective-c ios memory-leaks xcode-instruments


【解决方案1】:

除了 Jasarien 答案之外,您应该将您的方法命名为:

+ (EInspectorFacilityInfo*) inspectorFacilityInfoWithNode: (CXMLNode*) node

这将解决您的问题并符合 Cocoa 编码风格和精神。

【讨论】:

    【解决方案2】:

    该方法中包含单词“new”,因此Objective-C conventions 预计会返回对该对象的拥有引用,即。保留计数为 1 的对象。自动释放对象返回保留计数为 0 的对象。

    您必须从方法名称中删除单词 new,或者不自动释放对象 - 在这种情况下,调用者将负责释放它。

    【讨论】:

    • 我用“create”之类的东西替换了 new 这个词,内存泄漏已经消失了......非常感谢您的帮助。
    猜你喜欢
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多