使用UICollectionView和MPMediaItemArtwork时发生内存泄漏



我正在构建一个基本的音乐播放器应用程序,利用苹果的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,但这似乎没有效果。此外,我有一个表视图,它类似地使用了一个小的UIImageviews来进行封面艺术,这似乎导致了类似的问题。

有没有可能我明显忽略了什么?对于几百个带有小相册艺术的单元格,我认为这应该是可能的,而不需要大量的内存使用。

非常感谢您的帮助。

已修复-不确定原因,但MPMediaItemArtwork.imageWithSize(size:CGSize)方法每次调用时都会不断重新分配内存。相反,我用UIImage属性对NSObject进行了子类化,并在collectionViewDataSource的初始加载中将所有艺术品存储在这些NSObject的数组中,然后将其传递给configureWithAlbum

请参阅MPMediaItemPropertyArtwork导致崩溃(奇怪的问题(

相关内容

  • 没有找到相关文章

最新更新