2012-09-24 61 views
2

我開始使用在這裏描述的技術來監視應用程序的內存使用情況: Programmatically retrieve memory usage on iPhone的NSString stringWithFormat叫XX次導致內存警告

我寫了3次試驗嘗試一下,這是我發現:

- (void)test1 { 
for (int i = 0; i < 1000; i++) { 
    NSMutableString *str = [NSMutableString stringWithString:@""]; 
    for (int j = 0; j < 1000; j++) { 
     [str appendString:@"some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string "]; 
    } 
}  

- (void)test2 { 
for (int i = 0; i < 100000; i++) { 
    @autoreleasepool { 
     NSString *stri = @""; 
     stri = [NSString stringWithFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i]; 
    } 
} 


- (void)test3 { 
NSString *str = @""; 
for (int i = 0; i < 500; i++) { 
    str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i]; 
} 

當我打電話test1或test3內存得到正確分配和釋放 - 我可以看到它使用上面的鏈接中描述的report_memory功能。 但是,當我打電話test2內存不會被取消分配 - report_memory升起來。如果我多次調用test2,我的應用程序會收到內存警告並終止。

我正在使用ARC。任何人都可以解釋這裏發生了什麼?

+0

你在哪裏使用stringWithFormat的結果...就像NSString * str = [NSString stringWithFormat:@「」]; – Rajneesh071

+0

那麼爲什麼當你不使用它時,你正在寫stringWithFormat – Rajneesh071

+0

蘋果有很多文檔說明如何在緊密的循環中創建它們中的許多文件來解釋autorelease池的使用方法; –

回答

1

釘了它!我啓用了Zombie Objects並忘記了它們,因此即使在使用@autoreleasepool塊時,任何分配的對象也不會被釋放。

0

這是因爲您在每次迭代中使用不同的自動發佈實例。第一種情況是您有一個名爲str的對象,並且您正在追加到同一個實例。這就是爲什麼記憶不在那裏泄漏。

嘗試改變這樣的呼叫,檢查,

- (void)test2 
{ 
    NSString *str = @""; 
    for (int i = 0; i < 100000; i++) 
    { 
     str = [str stringByAppendingFormat:@"%d some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really long string some really", i]; 
    } 
} 
+0

謝謝你的建議 - 這對我<500的工作。我更新了我的問題,它仍然是開放的。 –

1

stringWithFormat返回誰被自動釋放一個NSString的對象。因此,當線程結束時釋放自動釋放池時,該對象將被釋放。

+0

1.我使用NSTimer更新內存使用情況,以便在不同的事件循環中更新內存使用情況。 2.我使用UIButton多次調用test2 - 這裏也是不同的事件循環。 –