我的應用程序在〜23MB ..iPhone - 3MB文件到一個NSArray的== 22MB
我加載一個3MB文件到一個NSArray如下關停在3G版iPhone ......是海峽和線不自動釋放?任何建議更好的方式來做到這一點?
NSString *str = [NSString stringWithContentsOfFile:path
encoding:NSUTF8StringEncoding error:&error];
NSArray *lines = [str componentsSeparatedByString: @"\n"];
[self parseDictLines:lines];
- (void)parseDictLines:(NSArray *)lines {
int i = 0;
NSMutableArray *arr = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *word_list = [[NSMutableArray alloc] init];
for (NSString *line in lines) {
i++;
[arr addObject:line];
if (i == 3) {
i = 0;
[word_list addObject:[arr copy]];
[arr removeAllObjects];
}
}
self.mDict = (NSArray*)word_list;
[word_list release];
}
編輯 - 應用程序是這樣的代碼之前< 1MB或者如果我跳過這個代碼。它運行後是22mb ...所以它不能成爲臨時變量。它的可用性直到我做了一些增加另一個1mb的值,然後保存它。
EDIT2 - 文件的NSString * str是5.9mb--我假設由於字符串在內存中編碼的方式是UTF8文件的兩倍大。 *行數組也是這個大小。
但是,直到我添加了自動發佈池之後,str才被立即釋放。使用樂器運行需要5分鐘的時間,NSArray *線路才能填滿,在調用[線路釋放]之後,在內存開始消失之前需要大約3分鐘,而在線陣列使用的內存耗盡之前5分鐘之後,到< 1mb。我的mDict數組是14mb。我不知道爲什麼,因爲它沒有那麼多NSArray *行是6mb ...
下面的代碼解決了我的問題,顯然是我在str和行內存釋放之前達到內存限制。現在,str被立即釋放,釋放了6MB,並且當代碼在後臺加載時,用戶無法超越極限。
但 - 爲什麼操作系統傾銷我的應用程序,當我已經自動發佈12mb?它不會清理需要自行發佈的任何內容嗎?
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
NSArray *lines = [[str componentsSeparatedByString: @"\n"] retain];
[pool drain];
[self parseDictLines:lines];
[lines release];
也許不要一次加載整個數組:而是按需加載(分頁或單個條目或什麼)。這需要更多的前期設計,並不一定適用。也許它可能更好地存儲在二叉樹或堆中或利用另一種存儲機制。 – 2011-05-26 02:20:23
如果文件是3MB,我不得不想象一下,基本上NSArray的行數不能超過3mb ......我必須在上面的代碼中犯錯誤。我大概可以將它加入子集,然後根據需要從我們將看到的文件加載剩下的部分。我不想發瘋,因爲我是新來的ObjectiveC – Mark 2011-05-26 03:32:41
在你的應用上運行'instruments',看看你能否識別內存泄漏,它是一個很棒的工具 – Mark 2011-05-26 03:49:37