2012-04-09 51 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