使用UICollectionView和MPMediaItemArtwork来解决内存泄漏问题

时间:2016-08-07 00:33:35

标签: ios swift uitableview uicollectionview mpmediaitem

我正在构建一个基本的音乐播放器应用程序,利用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 个答案:

答案 0 :(得分:0)

修复 - 不确定为什么但MPMediaItemArtwork.imageWithSize(size:CGSize)方法每次调用时都会不断重新分配内存。相反,我使用UIImage属性将NSObject子类化,并在collectionViewDataSource的初始加载中将所有图稿存储在这些NSObject的数组中,并将其传递给configureWithAlbum

请参阅MPMediaItemPropertyArtwork causes crash (weird issue)