我正试图让这个循环释放它所使用的所有内存,但它仍然很快吞噬了RAM。希望有人可以告诉我如何能够解除他们应该释放的字符串。基本上,循环将双精度写入文本文件,有时它必须写入几兆字节。
for (int i = 0; i < number_of_samples; i++)
{
if (print_str == nil)
{
print_str = [[NSMutableString alloc] init];
}
NSString* add_str = [[NSString alloc] initWithFormat:@"\n%0.06f", number_of_seconds/number_of_samples*i];
[print_str appendString:add_str];
[add_str release];
for (int g = 0; g < number_of_channels; g++)
{
add_str = [[NSString alloc] initWithFormat:@"\t%f", data_buffer[g + i*number_of_channels]];
[print_str appendString:add_str];
[add_str release];
}
if (i % 100 == 0 && i != 0)
{
fprintf(c_file_handle, "%s", [print_str UTF8String]);
[print_str release];
print_str = nil;
}
}
答案 0 :(得分:1)
因为你基本上使用那个字符串作为临时缓冲区,如何分配一次,initWithFormatting它就像你想要的那样频繁?然后在完成循环后释放它。
NSString * add_str = [NSString alloc];
loop... {
NSString* add_str = [ add_str initWithFormat:@"\n%0.06f", number_of_seconds/number_of_samples*i];
[print_str appendString:add_str];
}
// end of loop
[add_str release];
答案 1 :(得分:1)
对字符串唯一可以做的就是不使用 print_str ,因为它仍然保存所有字符串并占用内存。使用 fopen 中的“a”选项将数据附加到文件,并将格式化字符串 add_str 附加到文件中,而不是将其添加到内存中缓冲。
答案 2 :(得分:1)
您可以尝试使用fprintf
,而不是创建字符串并使用NSOutputStream
。您的代码可能如下所示:
NSOutputStream *os = [NSOutputStream outputStreamToFileAtPath:@"/path/to/file.ext"
append:YES];
[os open];
for (int i = 0; i < number_of_samples; i++) {
// create a buffer to store the data to write
[os write:buffer maxLength:bufferLength];
// release the buffer
}
[os close];
这是一个粗略的草图 - 有关详细信息,请参阅NSStream和NSOutputStream的文档。
答案 3 :(得分:0)
您可以使用[print_str appendFormat:]
,而不是每次都分配和发布新字符串。
在紧密循环中运行时,有时需要创建一个NSAutoRelease
池并定期将其排空并创建一个新池,但我没有看到您使用任何自动释放的对象。
您可以随时free
data_buffer
或以后再使用它吗? free(data_buffer[g + i*number_of_channels]);