【问题标题】:Mac OSX objective-c NSString memory leaking with ARCMac OSX objective-c NSString 内存泄漏与 ARC
【发布时间】:2015-06-20 10:16:00
【问题描述】:

今天我用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 已开启)?

【问题讨论】:

    标签: objective-c macos memory-leaks nsstring automatic-ref-counting


    【解决方案1】:

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

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

    @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";
    

    【讨论】:

    • 非常感谢您的帮助!现在它可以工作了(:!
    猜你喜欢
    • 2013-05-23
    • 2016-09-05
    • 2020-09-15
    • 1970-01-01
    • 2017-03-18
    • 2013-05-22
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多