【问题标题】:XCode Instruments has found a memory leak: why?XCode Instruments 发现内存泄漏:为什么?
【发布时间】:2012-05-30 03:08:42
【问题描述】:

我正在对我正在创建的应用程序进行调试,但在运行仪器时发现我无法理解的内存泄漏。

如果我尝试按照 Instruments 的建议修改代码,我的应用程序会因为

而崩溃

消息发送到解除分配的实例

有人可以帮我吗?

- (void) objectAtIndex:(int)index {
    SpecialObject *specialObj = [SpecialObject sharedInstance];

    id model = [self.datasource objectAtIndex:index];

    if ([model isKindOfClass:[ClassA class]]) {
        ClassA *objA = (ClassA *)model;
        specialObj.title = objA.title;

    } else if ([model isKindOfClass:[ClassB class]]) {
        ClassB *objB = (ClassB *)model;
        specialObj.title = objB.title;
    }
}

self.datasourceNSMutableArrayspecialObj.titleNSString

它们被定义为@property(nonatomic, retain)

我的问题是 Instruments 告诉我这些 2

ClassA *objA = (ClassA *)model;
ClassB *objB = (ClassB *)model;

是泄漏,但如果我释放 objAobjB 我的应用程序崩溃。

感谢您的帮助!

【问题讨论】:

  • dataSource是什么类型的对象?它肯定会从该方法返回一个自动释放的对象吗?
  • 嗨,保罗,谢谢:它是一个 NSMutableArray(我已经编辑了第一篇文章)。
  • 你能提供[self.datasource objectAtIndex:index]的实现吗?
  • 是NSArray类的方法,不是我的。
  • 对不起,我的意思是self.dataSource。我做了复制和粘贴,但我忘了删除第二部分。

标签: objective-c ios memory-management memory-leaks


【解决方案1】:

经过一番搜索,我发现了问题:XCode 通常会告诉您泄漏的位置,但有时它会为您提供可能的位置。

这意味着内存泄漏发生在程序流中的某个地方,即 XCode 指示的点,不一定是它所说的确切位置。

希望这可以帮助将来的其他人!

【讨论】:

    【解决方案2】:

    泄漏和您的异常是不同的东西。几乎可以肯定,该异常是由于发布了您不应该发布的内容而引起的。

    你们都拥有这两个事实表明你对 Objective-C 内存管理的理解不够出色。

    您应该首先专注于理解异常,而这样做的第一步是查看exception traceback

    【讨论】:

    • 亲爱的 Hot Licks,问题不在于我有泄漏和异常;我的问题是,如果我在 XCode 之后释放对象,我的应用程序崩溃,如果我不这样做,它告诉我是泄漏。因此,如果您的理解比我好,并且我确定是因为我是新手,那么我的问题的解决方案是什么?而且我能够阅读异常回溯,它回到了我在问题中发布的点。
    【解决方案3】:

    我的猜测是你永远不会释放数据源。假设你没有使用 ARC,在你的 dealloc 方法中,你应该有

    [self setDataSource: nil];
    

    [instanceVariableThatBacksDataSourceProperty release];
    

    很多人都做前者,但苹果推荐后者,这样在释放过程中不会触发 KVO。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 2023-04-10
      • 2017-05-26
      • 2016-01-10
      • 2011-08-07
      • 1970-01-01
      • 2013-11-14
      相关资源
      最近更新 更多