XCode Instruments发现内存泄漏:为什么?

时间:2012-05-23 14:32:09

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

我正在对我正在创建的应用程序进行调试,但运行的工具我发现了一个我无法理解的内存泄漏。

如果我尝试按照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)

我的问题是乐器告诉我这两个

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

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

[self setDataSource: nil];

[instanceVariableThatBacksDataSourceProperty release];

许多人做前者,但Apple建议使用后者,以便在解除分配期间不会触发KVO。

答案 1 :(得分:0)

泄漏和你的异常是不同的事情。几乎可以肯定的是,释放了一些你不应该发布的东西。

你们两个都表明你对Objective-C内存管理的理解不是很好。

您应该首先集中精力理解异常,这样做的第一步是查看exception traceback

答案 2 :(得分:0)

经过一些搜索我发现了问题:XCode 通常告诉泄漏的位置,但有时它会给你一个可能的位置。

这意味着内存泄漏位于程序流程中的某个位置,直到XCode指示的位置,不一定就是它所说的位置。

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