2012-04-09 43 views
0

我正在使用工具的泄漏工具。它说我在init方法中有一些泄漏。它显示NSMutableArray泄漏。我在init中有一些泄漏。我看到没有人泄漏

我没有看到任何泄漏。

@interface BookSettings : NSObject 
    @property (nonatomic, retain) NSString *title; 
    @property (nonatomic, retain) NSMutableArray *authors; 
@end 

- (id)init 
{ 
    self = [super init]; 

    if(self) 
    { 
    title   = [[NSString stringWithString:@""] retain]; 
    authors   = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
[title release]; 
[authors release]; 
[super dealloc]; 
} 

回答

2

所提供的代码是OK的,问题是其他地方在那里的作者得以保持,而平衡释放。泄漏只是指向伊娃创建的地方,而不是发布失败的地方。检查所有保留计数增加的地方。

如果你需要看到保留,发布和自动释放出现一个对象使用仪器:在仪器

运行,在设定“记录的引用计数”关于分配(你必须停止记录设置的选项)。导致问题代码运行,停止录制,在那里搜索感兴趣的ivar,深入了解,您将能够看到所有保留,发布和autoreleases发生。

认真考虑使用ARC,有什么理由不,ARC支持背到iOS 4.x版

BTW:

title = [[NSString stringWithString:@""] retain]; 

可以更紧密地写:

title= @""; 
+0

我使用了一些库,例如ASIHHTP,它不支持ARC。这就是为什么我不使用ARC。 – Voloda2 2012-04-09 13:10:29

+0

ARC可以在每个文件的基础上使用,但我理解您的问题,第三方代码可以保留一个。 – zaph 2012-04-09 13:24:04

0

我认为这是标题。 您已经拥有了财产非原子,保留,所以这意味着保留1

计数然后您指定的其他保留,使得保留计数2

在的dealloc,你松开一次,减少保留计数为1.因此,保持字符串的这1个引用是泄漏。

我不明白你为什么初始化字符串一样,反正...

+0

是的,很简单:'标题= @ “”;'是所有需要。 – zaph 2012-04-09 12:01:04

+0

我认为“作者”也是如此。你应该在释放它们之前,在释放它们之前,在dealloc NSLog(“retain count%i /%i”,[title retainCount],[authors retainCount])中为作者和标题保留一个保留计数)。 – BBog 2012-04-09 12:09:44

+0

不要使用retainCount,它几乎不会是预期的,有更好的方法。想想亲戚,增加需要与减少平衡。通过bbum查看[retaincount is useless](http://www.friday.com/bbum/2011/12/18/retaincount-is-useless/)。最佳:使用ARC! – zaph 2012-04-09 12:21:16