XCode Instruments 发现了内存泄漏:为什么会出现这种情况?

3

我正在创建一个应用程序,并进行调试,但是在运行instruments时,我发现了一个我无法理解的内存泄漏问题。

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

有漏洞,但如果我释放objAobjB,我的应用程序会崩溃。

感谢任何帮助!


dataSource 是哪种类型的对象?它是否肯定从该方法中返回一个自动释放的对象? - Paul.s
嗨,保罗,谢谢:这是一个NSMutableArray(我已编辑第一篇帖子)。 - Marco Pace
你能提供 [self.datasource objectAtIndex:index] 的实现吗? - Lorenzo B
这是NSArray类的一个方法,不是我的。 - Marco Pace
我在viewDidLoad方法中使用[NSMutableArray array]初始化该数组。很遗憾,我不能使用ARC :-( - Marco Pace
显示剩余6条评论
3个回答

0

我猜你没有释放数据源。假设您没有使用ARC,在dealloc方法中,您应该有:

[self setDataSource: nil];

或者

[instanceVariableThatBacksDataSourceProperty release];

许多人做前者,但苹果建议采用后者,以避免在释放期间触发KVO。


0
经过一番搜索,我找到了问题所在:XCode通常会告诉你内存泄漏的位置,但有时它只会给出一个可能的位置。
这意味着内存泄漏可能在程序流程中的某个地方,而不一定是XCode指示的确切位置。
希望这能帮助未来的其他人!

0

泄漏和异常是两回事。异常几乎肯定是由于释放了不应该释放的东西引起的。

你同时拥有这两个东西表明你对Objective-C内存管理的理解并不是非常出色。

你应该首先集中精力理解异常,而迈向这一目标的第一步是查看异常回溯


亲爱的Hot Licks,我的问题不是我有泄漏和异常;我的问题是如果我在XCode中释放对象,我的应用程序会崩溃,如果我不这样做,它会告诉我有泄漏。所以如果你的理解比我好,我相信它是因为我是个新手,那么我的问题的解决方案是什么?我能够阅读异常回溯,它回到我在我的问题中发布的点。 - Marco Pace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接