Mac OSX objective-c NSString 内存泄漏与 ARC

Mac OSX objective-c NSString memory leaking with ARC

今天我用NSStrings测试了一个。可悲的是,当我 运行 这段代码(xcode 仪器向我显示)时,我有严重的内存泄漏:

- (IBAction)start:(id)sender {
    while (true)  // Yes I know that this is an infinity loop
    {
        NSString *test = [[NSString alloc] init];
        test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
        test = nil; 
        // Why does this leak memory ? I think ARC is releasing it automatically ?
    }
}

这是仪器的屏幕截图:

我能帮我理解一下吗为什么这段代码会泄露(ARC 开启)?

内存只是在自动释放池中,当池被耗尽时内存被回收。通常这是 运行 循环循环的时候,但在像这样的紧密循环中,运行 循环永远没有机会,因此需要明确地耗尽池。

在这种情况下,就在脚趾循环内添加一个自动释放池:

@autoreleasepool {
    code
}

在这种情况下:

while (true)  // Yes I know that this is an infinity loop
{
    @autoreleasepool {
        NSString *test = [[NSString alloc]init];
        test = [NSString stringWithFormat:@"llalalallalalallalalalalallalalllallalalallalal"];
        test = nil; 
    }
}

顺便说一句,没有格式代码的 stringWithFormat 只是创建与按字面定义的字符串相同的字符串:

test = @"llalalallalalallalalalalallalalllallalalallalal";