4

在最新的Xcode(4.6.2)下的ARC下面的簡單代碼顯示泄漏儀器,在iOS模擬器中,發佈構建配置-Os優化:奇怪的內存泄漏與塊和在ARC中以某種方式複製

- (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編譯器)?

+0

你確定ARC是否打開?嘗試插入'-retain'並查看編譯器是否抱怨。 – 2013-05-04 07:42:55

+0

@KevinBallard:是的,ARC已開啓。如果ARC未打開,爲什麼關閉優化時泄漏會消失?此外,該塊被釋放,如儀器中所見;它只是沒有被釋放。 – user102008 2013-05-06 07:20:36

+0

如果您替換id x = block,會發生什麼情況? [x copy];'用'[block copy]'? – 2013-05-09 15:22:31

回答

0

這似乎是編譯器或泄漏儀器中的一個錯誤,我不確定是哪一個。你應該向Apple提交一個bug。代碼縮短該時

同樣泄漏也會發生:

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

id x = block; 

的泄漏只出現如果該塊從父範圍引用的局部變量。

您是否看到這種情況發生在實際生產代碼中,或者僅在此示例中出現?