需要帮助一个吞噬RAM的循环

时间:2011-08-17 21:30:48

标签: objective-c ios memory-management nsstring

我正试图让这个循环释放它所使用的所有内存,但它仍然很快吞噬了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;
    }
}

4 个答案:

答案 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];

这是一个粗略的草图 - 有关详细信息,请参阅NSStreamNSOutputStream的文档。

答案 3 :(得分:0)

  1. 您可以使用[print_str appendFormat:],而不是每次都分配和发布新字符串。

  2. 在紧密循环中运行时,有时需要创建一个NSAutoRelease池并定期将其排空并创建一个新池,但我没有看到您使用任何自动释放的对象。

  3. 您可以随时free data_buffer或以后再使用它吗? free(data_buffer[g + i*number_of_channels]);