如何使用 collectionview 摆脱保留循环
How to get rid of retain cycle with collectionview
我在销毁 viewcontroller 时遇到了麻烦,因为我认为这是集合视图和 viewcontroller 之间的保留周期。我尝试使 collectionview 成为一个弱变量,但现在每当我尝试将 collectionview 添加到 viewcontroller 时,我都会得到 nil。如果有其他方法可以尝试,而不是让 collectionview 变弱,我也愿意。
weak var table = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: UICollectionViewFlowLayout())
weak var customFlowLayout = UICollectionViewFlowLayout() //default cell spacing is 10
table?.frame = CGRect(x: 0, y: 50, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
table?.isHidden = true
table?.backgroundColor = UIColor.white
table?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "customCellIdentifier")
table?.dataSource = self
table?.delegate = self
//table.rowHeight = CGFloat(100)
customFlowLayout?.minimumLineSpacing = 5 //default is 10
table?.collectionViewLayout = customFlowLayout!
self.view.addSubview(table!) //this is the line that breaks every time
我在您提供的代码中没有看到任何循环保留。除非有一个块被传递到某处,否则很难有一个由标准 UICollectionView
直接引起的保留周期。如果有的话,很可能你持有 UICollectionView
的视图控制器永远不会被释放。
UICollectionView
的视图控制器上的 属性 可能很弱,但您需要将局部变量声明为强引用(没有 weak
),如下所示:
class ViewController : UIViewController {
weak var collectionView: UICollectionView?
// Maybe in viewDidLoad()
let cv = UICollectionView(...)
...
self.view.addSubview(cv)
self.collectionView = cv
你的本地声明应该是一个强引用,否则它将被分配并立即释放,因为没有任何东西持有它。一旦 cv
被添加为子视图,那么它将具有来自 view
的强引用。您的 class 的 属性 称为 collectionView
现在可以是一个弱引用,一旦视图被释放,collectionView
就会被释放。
我在销毁 viewcontroller 时遇到了麻烦,因为我认为这是集合视图和 viewcontroller 之间的保留周期。我尝试使 collectionview 成为一个弱变量,但现在每当我尝试将 collectionview 添加到 viewcontroller 时,我都会得到 nil。如果有其他方法可以尝试,而不是让 collectionview 变弱,我也愿意。
weak var table = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: UICollectionViewFlowLayout())
weak var customFlowLayout = UICollectionViewFlowLayout() //default cell spacing is 10
table?.frame = CGRect(x: 0, y: 50, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height)
table?.isHidden = true
table?.backgroundColor = UIColor.white
table?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "customCellIdentifier")
table?.dataSource = self
table?.delegate = self
//table.rowHeight = CGFloat(100)
customFlowLayout?.minimumLineSpacing = 5 //default is 10
table?.collectionViewLayout = customFlowLayout!
self.view.addSubview(table!) //this is the line that breaks every time
我在您提供的代码中没有看到任何循环保留。除非有一个块被传递到某处,否则很难有一个由标准 UICollectionView
直接引起的保留周期。如果有的话,很可能你持有 UICollectionView
的视图控制器永远不会被释放。
UICollectionView
的视图控制器上的 属性 可能很弱,但您需要将局部变量声明为强引用(没有 weak
),如下所示:
class ViewController : UIViewController {
weak var collectionView: UICollectionView?
// Maybe in viewDidLoad()
let cv = UICollectionView(...)
...
self.view.addSubview(cv)
self.collectionView = cv
你的本地声明应该是一个强引用,否则它将被分配并立即释放,因为没有任何东西持有它。一旦 cv
被添加为子视图,那么它将具有来自 view
的强引用。您的 class 的 属性 称为 collectionView
现在可以是一个弱引用,一旦视图被释放,collectionView
就会被释放。