4

以下简单代码在 ARC 下,在最新的 Xcode (4.6.2) 中显示了在使用 Leaks 工具进行分析时,在 iOS 模拟器中,在具有-Os优化的发布构建配置中时的泄漏:

- (BOOL)application:(UIApplication *)application
  didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    for (int i = 0; i < 10; i++)
    {
        void (^block)() = ^
        {
            NSLog(@"%d", i);
        };

        id x = block;
        [x copy];
    }

    return YES;
}

它显示了 10 个泄露的块。(它不会显示关闭优化的泄漏;但关闭优化对我们的应用程序来说是不现实的。)奇怪的是,查看每个泄漏块的内存管理历史记录,它们看起来都很好——每个都有一个 malloc从副本和发布;但不知何故释放不会释放它?

这是一个编译器错误(它使用的是默认的 Apple LLVM 编译器)吗?

4

1 回答 1

0

这似乎是编译器中的错误或泄漏工具,我不确定是哪个。您应该向 Apple 提交错误。

将代码缩短到此时也会发生相同的泄漏:

int i = 0;
void (^block)() = ^{
    int y = i;
};

id x = block;

仅当块引用父作用域中的局部变量时才会出现泄漏。

您是否看到这种情况发生在实际生产代码中或仅在此示例中?

于 2013-05-30T14:18:20.407 回答