我创建了一个UICollectionView
,其单元格包含几种类型的UIViewController
视图作为它们的contentView。我想缓存未使用的UIViewController
。我曾尝试根据其索引路径创建当前使用的UIViewController
的字典,以及一组要回收的UIViewController
的未使用UIViewController
。但是我注意到我的UIViewControllers没有被初始化。我的实现基于这些答案Add UIViewController to UICollectionViewCell和Make PageViewController reuse viewControllers like tableView。
下面是我的实现
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
addViewController(toCell: cell, at: indexPath, of: viewTypes[indexPath.item])
}
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
removeViewController(fromCell: cell, at: indexPath)
// cleanCachedViewControllers(index: indexPath.item)
}
func addViewController(toCell cell:UICollectionViewCell, at indexPath:IndexPath,of type:ViewControllerType){
var childViewController:UIViewController!
if let cvc = currentViewControllers[indexPath]{
childViewController = cvc
}else{
childViewController = TestViewController()
currentViewControllers[indexPath] = childViewController
}
self.addChild(childViewController)
childViewController.view.frame = cell.contentView.bounds
cell.contentView.addSubview(childViewController.view)
childViewController.didMove(toParent: self)
}
func removeViewController(fromCell cell:UICollectionViewCell, at indexPath:IndexPath){
guard let childViewController = currentViewControllers[indexPath] else {
return
}
print("remove view controller called")
childViewController.willMove(toParent: nil)
childViewController.view.removeFromSuperview()
childViewController.removeFromParent()
// currentViewControllers[indexPath] = nil
// currentViewControllers.removeValue(forKey: indexPath)
childViewController.view = nil
recycledViewControllers.insert(childViewController)
}
func getRecycledViewController(type:ViewControllerType)->UIViewController{
var unusedViewControllers = recycledViewControllers.filter { (viewController) -> Bool in
return viewController.isKind(of: type.type) && viewController.parent == nil
}
if let reusableViewController = unusedViewControllers.first{
recycledViewControllers.remove(reusableViewController)
return reusableViewController
}else{
let newViewController = type.initializeViewController()
// recycledViewControllers.append(newViewController)
return newViewController
}
}
答案 0 :(得分:0)
您可能有一个循环引用,可以防止对象被释放。
Xcode 8和更高版本允许您调试和可视化当前内存图。这对于解决为什么未释放对象的问题非常有用。