2010-08-18 93 views
3

我有下面的块给我的性能工具的问题:特别是它说STObject泄漏。我不知道为什么?看不到为什么这里有内存泄漏

for (NSDictionary *message in messages) 
{ 
    STObject *mySTObject = [[STObject alloc] init]; 

    mySTObject.stID = [message valueForKey:@"id"]; 

    [items addObject:mySTObject]; 
    [mySTObject release]; mySTObject = nil; 

} 
[receivedData release]; receivedData=nil; 
[conn release]; conn=nil; 

UPDATE:

项目是@属性(非原子,保留),这会导致保留计数为+2?

+2

你用'items'做什么? – 2010-08-18 13:03:03

+3

可能不在这一部分。你用静态分析仪检查过了吗? – Eiko 2010-08-18 13:05:11

+0

我将项目传递给我的代理。它在dealloc中发布 – 2010-08-18 13:09:51

回答

-4

您正在释放之后设置mySTObject为零......

 [mySTObject release]; mySTObject = nil; 

只是删除mySTObject = nil;我觉得应该是吧..

+0

这不是一个问题。 – 2010-08-18 15:45:05

+0

这将是泄漏工具中的一个错误。你确定会解决它吗? – JeremyP 2010-08-18 15:46:10

+0

我认为他已经习惯了GC objective-c,但是在这种情况下会崩溃。 – 2010-08-21 07:53:18

4

你有存储在STObject一些变量/属性?如果你这样做,你需要在STObject的“ - (void)dealloc”方法中释放它们。否则,虽然STObject被释放,但STObject所拥有的变量不会被释放。

dealloc方法的一个例子是:

- (void)dealloc { 
    [stID release]; 
    [myVar2 release]; 
    [myVar3 release]; 
    [super dealloc]; 
} 

另外,还要确保你调用[超级的dealloc]在方法的结束。

+0

+1我认为这可能是答案,尽管泄漏应该指向STObject代码。但是,泄漏并不完美。 – TechZen 2010-08-23 12:58:44

+0

是的,我也会看看stID的属性声明,也可能会保留......也许。 – livingtech 2010-08-27 19:36:23

6

如果你添加一些NSArray或NSDictionary它的保留,你的mySTObject被保留,这意味着当你这样做时它仍然存在 - 释放,然后将它设置为零。将物体从保留物体中取出,并且“泄漏”消失。

+0

释放数组将具有相同的效果,因为数组将在释放它时释放其中的所有内容。 – 2010-08-19 01:58:41

+0

Ofcourse,但代码片段太小,我不知道他在做什么,只是试图帮助。 – 2010-08-19 08:39:30

+0

我在哪里可以释放阵列?项目位于传递给委托的辅助类中。我在dealloc()中释放它。 – 2010-08-19 13:27:22

0

如果你在10.6上,Xcode有“构建和分析”,我发现它是调试内存泄漏的非常好的工具。文档可用here