2014-03-05 54 views
3

在做了一些調試之後,我發現下面的代碼會讓我的應用程序的內存使用量不斷增長,直到應用程序崩潰。當我啓動應用程序時,內存使用量約爲2MB,然後當我不停地滾動時,它會繼續增長。當我停止滾動一秒鐘時,內存使用量會減少(但不是關鍵的,例如從50M到35M)。請看看爲什麼我:UICollectionView迭代單元格 - 內存警告

這是在我的自定義UICollectionViewController子發生:

for (myAppCell *cell in [self.collectionView visibleCells]) 
{ 
    UILabel *label [[UILabel alloc] initWithFrame:CGRectMake(10, 10, cell.frame.size.width, cell.frame.size.height)]; 
    label.text = @"Hello World!"; 

    [cell.contentView addSubview:label]; 
} 

現在,這裏是我在調試時提出的意見:

  1. 如果我評論所有的代碼,並且在無限的時間內來回滾動,應用程序內存穩定在2.1MB(在這種情況下,它繼續循環但實際上沒有內部 - 因此問題必須與UILabel的分配有關) 。
  2. 我試圖檢查收集視圖和單元格的子視圖計數,他們分別是14和1(因爲它應該是 - 所以問題不是我認爲子視圖的積累)。
  3. ARC已打開。
  4. 編輯實際上,只有當我將UILabel添加到單元格時纔會出現問題。當我評論最後一行時([cell.contentView addSubview:label),應用程序也正常運行。因此它必須是這條線。
  5. 編輯:順便說一下,我不去除細胞一次他們是無形的(我不知道該怎麼辦,如果我真正需要做的,我是相當新的IOS編程)。

現在,因爲正如我所說的,當我註釋掉內部塊的應用程序正常運行,我沒有張貼代碼的,其剩餘的 - 也就是說,它創建我的細胞,當我滾動沒有問題(內存遺體在2.1MB)。

可能是什麼問題?

編輯

此代碼位於我CustomCollectionViewControllerreloadData方法。它從scrollViewDidEndDecelerating方法調用。

+0

在該方法中,你通過所有可見的單元格,添加這個標籤迭代?什麼觸發你的這個''for'循環?你說你在你的子類中這樣做,但你沒有說在哪裏。 – Rob

+0

@Rob我編輯了這個問題。 – Shaokan

+0

您是不是使用'cellForItemAtIndexPath'將子視圖添加到您的單元格? – Merlevede

回答

5

因爲無論何時滾動收集視圖,您都會一次又一次地向該視圖添加UILable。這會增加內存。在添加新視圖之前,您可以簡單地從該單元格中刪除所有現有的視圖。

使用此代碼刪除所有子視圖

[[cell.contentView subviews] 
    makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
+0

就是這樣。謝謝!今天學到了新東西:) – Shaokan

+0

不應該是'subviews'(複數)嗎? – smileham

+0

@smileham拼錯吧,現在更新 – CoolMonster