2017-11-02 5 views
0

loswerden Ich habe Probleme, Viewcontrollers zu zerstören, was ich glaube, ein Retain-Zyklus zwischen einer Collectionview und dem Viewcontroller zu sein. Ich habe versucht, die collectionview zu einer schwachen Variable zu machen, aber ich bekomme jetzt nil, wenn ich versuche, die viewsammlung dem viewcontroller hinzuzufügen. Wenn es eine andere Route zum Versuch gibt, anstatt die Sammlung zu schwächen, bin ich auch dafür offen.Wie man Retain-Zyklus mit 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 
+0

Wie versuchen Sie ViewControllers zu zerstören? – atreat

+0

Sammlungsansicht sollte kein Problem sein. Problem ist, wenn Sie den direkten Verweis auf den View-Controller halten, dann kann der View-Controller nicht deaktiviert werden. Ich wette, du machst das irgendwo. – Luzo

Antwort

2

Ich sehe keine Rückhaltezyklen aus dem von Ihnen bereitgestellten Code. Wenn nicht irgendwo ein Block übergeben wird, ist es wahrscheinlich ziemlich schwierig, einen Retain-Zyklus direkt durch einen Standard UICollectionView verursacht zu haben. Es ist wahrscheinlich, dass Ihr View-Controller, der auf UICollectionView hält, niemals freigegeben wird.

Die Eigenschaft auf Ihren View-Controller für die UICollectionView kann schwach sein, aber Sie müssen die lokalen Variable als eine starke Referenz (keine weak) wie so erklären:

class ViewController : UIViewController { 
    weak var collectionView: UICollectionView? 

    // Maybe in viewDidLoad()  
    let cv = UICollectionView(...) 
    ... 
    self.view.addSubview(cv) 
    self.collectionView = cv 

Ihre lokale Deklaration ein stark sein sollte Hinweis, sonst wird es zugeteilt und sofort freigegeben, weil sich nichts daran festhält. Sobald cv als Unteransicht hinzugefügt wird, wird es eine starke Referenz von der view haben. Die Eigenschaft Ihrer Klasse collectionView kann jetzt eine schwache Referenz sein und die collectionView wird freigegeben, sobald die Ansicht freigegeben wird.

Verwandte Themen