我有一个程序读取一个巨大的文本文件(逐行)并在将每行写入数据库之前对每行执行一些字符串操作。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