我有一個程序讀取一個巨大的文本文件(逐行)並在將每行寫入數據庫之前對每行執行一些字符串操作。Objective-C內存泄漏了解問題
該程序需要越來越多的內存,所以我想我可能需要釋放我使用的字符串。但它沒有幫助。所以我把下面的代碼放在一起來測試實際發生的事情。隨着一些試驗和錯誤,我發現當我在自動釋放池上耗盡時,它就可以工作。
我想知道我在做什麼。所以我問:
- 爲什麼釋放不釋放內存?
- 有沒有更好的方法來做到這一點?
這裏是我的測試程序
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int cnt = 0;
while (cnt < 1000000000) {
NSMutableString *teststr = [[NSMutableString alloc] init];
teststr = [NSString stringWithString:@"Dummy string just for the demo"];
cnt++;
if (cnt % 1000000 == 0) {
printf("cnt=%i\n",cnt);
}
[teststr release];
// [pool drain]; // It works when I do this
// [[NSAutoreleasePool alloc] init]; // and this
}
[pool drain];
return 0;
}
編輯:基於到目前爲止,我還看着我原來的計劃,改變了測試程序的答案:
//teststr = [NSString stringWithString:@"Dummy string just for the demo"];
[teststr appendString:@"Dummy string just for the demo"];
這是否也創造一個新的字符串?因爲我仍然有內存問題。我的例程的工作原理是我在字符串後面添加了一些內容,但可能在開頭處以空字符串開頭。
我試過了,它的工作原理。當我按照你的建議進行初始化時,我沒有記憶問題。我從一個空字符串開始,所以我這樣做了:NSMutableString \t * teststr = [[NSMutableString alloc] initWithString:@「」];但我想知道爲什麼這個工作更好,然後只是「init」。我認爲「init」也是這樣(給我一個空字符串)。無論如何感謝您的答案。 – hol 2010-10-02 11:08:12
@Jürgen:是的'-init'給出一個空字符串。這並不總是更好,但是因爲你從一個已知的字符串開始,我會將init和append合併爲'-initWithString:'。 – kennytm 2010-10-02 11:11:37
是的,我嘗試了一下。基本問題實際上是在我原來的程序中,我初始化了,但是然後創建了一個新的字符串,並且發佈只發布了最後一個。 – hol 2010-10-02 11:23:29