使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏

Posted

技术标签:

【中文标题】使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏【英文标题】:Experiencing memory leak using UICollectionView and MPMediaItemArtwork 【发布时间】:2016-08-07 00:33:35 【问题描述】:

我正在构建一个基本的音乐播放器应用程序,利用 Apple 的 MediaPlayer 访问 iPod 库。在我的一种观点中,我使用 UICollectionView 来显示库中所有专辑的专辑封面。滚动时,内存使用量会大幅增加,这是我预期的,但使用量从未减少,最终应用程序由于内存压力而崩溃,在 Xcode 调试器中达到大约几百 mb。

这实际上是我用来配置每个 collectionView 单元格的代码:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(ALBUM_CELL_REUSE_IDENTIFIER, forIndexPath: indexPath) as! AlbumCollectionViewCell
    cell.configureWithAlbum(albumItems[indexPath.row])

    return cell



func configureWithAlbum(album: MPMediaItemCollection)
    guard let representItem = album.representativeItem else
        return
    

    if let albumTitle = representItem.albumTitle
        if let artwork = AlbumsCollectionViewDataSource.sharedInstance.artworkDict[albumTitle]
            backgroundImageView.image = artwork.imageWithSize(backgroundImageView.frame.size)
        
    

到目前为止,我已经尝试使用 NSCache 来缓存专辑封面,以及覆盖prepareForReuse 并设置backgroundImageView.image = nil,但这似乎没有效果。此外,我有一个 tableview,它同样使用一个小的 UIImageviews 作为封面艺术,这似乎会导致类似的问题。

我是否有可能明显忽略了某些东西?对于数百个带有小专辑封面的单元,我认为这应该可以在没有大量内存使用的情况下实现。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

已修复 - 不知道为什么,但 MPMediaItemArtwork.imageWithSize(size:CGSize) 方法在每次调用时都会不断地重新分配内存。相反,我使用 UIImage 属性对NSObject 进行子类化,并将所有艺术品存储在集合视图数据源初始加载时NSObjects 的数组中,并将其传递给configureWithAlbum

见MPMediaItemPropertyArtwork causes crash (weird issue)

【讨论】:

以上是关于使用 UICollectionView 和 MPMediaItemArtwork 遇到内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

Apache mpm模式优化

Apache三种MPM分析: PreforkWorker和Event

Apache 两种mpm prefork 和 worker 的区别

Apache PreforkWorker和Event三种MPM简单分析

Apache的三种MPM模式比较:prefork,worker,event

linux mpm模式用prefork好还是worker好