2010-05-11 76 views
1

我正在編寫一個iPad應用程序,用於下載一個相當大的.csv文件,並將該文件解析爲存儲在Core Data中的對象。該程序不斷崩潰,我已經與Allocations性能工具一起運行,可以看到它正在耗盡內存。幫助查找內存泄漏

代碼中沒有分配或初始化,爲什麼我會吞噬內存?

代碼爲:http://pastie.org/955960

謝謝! -Neal

+0

我是一個總新手,但只是提醒,alloc或init不是整個列表。它是「如果您使用名稱以」alloc「或」new「開頭或包含」copy「(例如alloc,newObject或mutableCopy)的方法創建它,或者如果您發送一個保留信息。」 – 2010-05-11 23:07:21

+0

在我學習的早期階段,我仍然相信,如果遵循規則,你永遠不會陷入困境。有點想看看如何發揮出來。 – 2010-05-11 23:08:21

回答

0

沒有泄漏。但是你要爲每個循環分配一個新的數組和字符串,當輸入非常長時,在自動釋放池可以耗盡之前它將會累積。

while (![scanner isAtEnd]) { 
    BOOL insideQuotes = NO; 
    BOOL finishedRow = NO; 
    NSMutableArray *columns = [NSMutableArray arrayWithCapacity:10]; 
    NSMutableString *currentColumn = [NSMutableString string]; 

因爲這些都是暫時的變量,你可以只移動他們的循環之外,並重新設置的迭代。

NSMutableArray *columns = [NSMutableArray arrayWithCapacity:10]; 
NSMutableString *currentColumn = [NSMutableString string]; 
while (![scanner isAtEnd]) { 
    BOOL insideQuotes = NO; 
    BOOL finishedRow = NO; 
    [columns removeAllObjects]; 
    [currentColumn setString:@""]; 
1

循環結束後內存佔用是否縮小?創建和自動釋放的對象將在while循環期間停留。您可能需要使用NSAutoreleasePool維護您自己的autorelease池。

+0

我也會用autorelease池理論。 – 2010-05-11 23:22:02