2009-09-04 63 views
2

當活動監視器運行,運行下面的代碼會不斷地提高程序的實際內存使用率:固有的UIView泄漏

CGRect frame = CGRectMake(0,0,0,0); 
while(true) 
{ 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    UIView *test = [[UIView alloc] initWithFrame:frame]; 
    [test release]; 
    [pool release]; 
} 

什麼情況是,從UIView的派生的所有對象會泄漏。有些會泄漏比其他更多(特別是UITextView已經注意到這個問題)。在泄漏監視器中並未發現泄漏事件 - 它們的存在只是由於內存使用量的不斷增加而暴露出來 - 事​​實上這會導致應用程序因爲內存耗盡而被操作系統終止。

有沒有人注意過這個?爲了記錄,代碼是針對OS 3.0編譯的。

+0

我想看到類似的東西,但還沒有追蹤到:-( – 2009-11-29 12:51:04

回答

0

這可能是UIKit在構建UIView時使用共享單例對象,並且由這些單例分配的東西不一定由NSAutoreleasePool清理,而是在標準事件循環執行期間通過其他方式進行清理。

+0

從我的測試中,即使在不同的事件循環中發生了alloc&init和release,也會發生相同的情況。這只是一個壓力情況。 – 2009-09-04 13:10:33

0

我同意這可能是iPhoneOS中的錯誤。它看起來像CALayer沒有得到釋放。如果你強制釋放CALayer([test.layer release],這是一個瘋狂的事情,但「有效」),你會大大減少內存使用量,但是你會發現QuartCore每次迭代仍然至少泄漏16個字節,這在你的壓力情況下加起來很快。我會打開一個雷達(bugreporter.apple.com)。

1

我想這是一個問題與儀器。使用iPhone OS 3.0時,儀器無法正常工作,例如你看不到堆棧跟蹤。在模擬器中使用3.1時,此問題消失(請參閱圖像)。這些沒有出現在樂器中的泄漏事實有助於我的假設。

當然,這也可能是iPhone OS 3.0確實存在問題,並已在iPhone OS 3.1中修復。

Instruments with OS 3.0 http://www.hillrippers.ch/temp/ObjAlloc%20OS%203.0.png
^^儀器與OS 3.0

Instruments with OS 3.1 http://www.hillrippers.ch/temp/ObjAlloc%20OS%203.1.png
^^儀器與OS 3.1

這是所使用的代碼(在applicationDidFinishLaunching:

NSUInteger i = 0; 
CGRect frame = CGRectMake(0.f, 0.f, 100.f, 50.f); 
while (i < 100000) { 
    UIView *test = [[UIView alloc] initWithFrame:frame]; 
    [test release]; 
    i++; 
}