3

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

如果我尝试按照 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.datasource是一段NSMutableArray时间specialObj.title是一个NSString

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

我的问题是 Instruments 告诉我这两个

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

是泄漏,但如果我释放objA并且objB我的应用程序崩溃。

谢谢你的帮助!

4

3 回答 3

0

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

[self setDataSource: nil];

或者

[instanceVariableThatBacksDataSourceProperty release];

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

于 2012-05-23T15:42:49.230 回答
0

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

两者都有的事实表明您对 Objective-C 内存管理的理解并不出色。

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

于 2012-05-23T15:47:28.987 回答
0

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

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

希望这可以在将来对其他人有所帮助!

于 2012-11-09T11:17:16.330 回答