2013-01-23 45 views
0

我使用的檔案找到任何內存泄漏。泄漏對象:ALasset和ALAssetPrivate

我發現2個有趣的泄漏,這是我無法理解:

Leaked Object | Responsible Library | Responsible Frame 

ALAsset   AssetsLibrary   [ALAssetsGroup _enumerateAssetsAtIndexes:options:usingBlock:]_block_invoke_0125 

ALAssetPrivate AssetsLibrary  -[ALAsset initWithManagedAsset:library:] 

是是我的問題還是AssetsLibrary?有沒有任何想法如何解決這個問題?

回答

1

的問題在於資產庫本身。它包含內存泄漏。證據是,下面的代碼已經示出了在探查泄漏(注意到我註釋掉線哪裏添加資產到一個可變的陣列):

[assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {   
     if(result == nil) { 
      *stop = YES; 
     } else { 
      //[theAssets addObject:result]; 
     } 
}]; 

一種可能的解決將是檢查保留計數ALAsset指針並在保留計數大於1時自行釋放一個額外時間(如果您自己沒有保留它,它應該在塊末尾爲1)。

編輯:

我注意到泄漏實際上是一個ALAssetPrivate對象,它是過度保留由ALAsset,所述ALAsset實例的保留計數是正確的。

編輯:

愚蠢的我來說,內存泄漏實際上是由一類我上ALAsset其中包括自身的dealloc方法實施造成的。這是泄漏的原因。

1

難道是我的問題還是AssetsLibrary?有沒有任何想法如何解決這個問題?

極有可能泄漏是由你自己的代碼引起的。 「責任框架」顯示ALAsset的事實僅表示內存已在該庫中分配。但是,如果你是該記憶的擁有者,你應該對泄漏負責。

至於如何解決這個問題,首先,給一個嘗試靜態分析器在Xcode。有時這有助於。

如果沒有,你怎麼使用AssetsLibrary或者您正在使用訪問任何中間框架的審查。檢查你所有的屬性,以及每次調用alloc/init或便利的構造函數。

如果你不知道線索,其中泄漏可能產生的一個有用的方法是選擇註釋掉的代碼塊(當然,你應該這樣以一種合理的方式,使應用程序可以運行,並不會崩潰)並再次檢查儀器,直到泄漏消失(在這種情況下,您知道是什麼原因造成的)。

+0

所以我不知道泄漏的確切位置,我明白了。謝謝 –

+0

看看我的編輯關於幾種方法前進... – sergio

+0

因此,評論所有塊我會找到適當的塊。另外我不明白什麼是assetprivate。它是保留着資產還是它是什麼?我從不使用這樣的對象。 –