2015-12-03 6 views
8

Ich frage mich, ob ich irgendwie über einen Fehler gestolpert bin, wo Swipe zum Löschen UITableViewCells nicht jemals freigeben, wenn ihre UITableViewController tut.deleteRowsAtIndexPaths: Wischen, um Zeilen zu löschen, wird die Zelle nie freigegeben?

Ich habe eine -dealloc-Methode in meine benutzerdefinierte Tabellenzelle hinzugefügt, die eine Nachricht ausloggt. Wenn ich auf den Navigationscontroller drücke, werden alle 6 Nachrichten abgemeldet.

Wenn ich wische, um einen (oder mehrere) zu löschen, und drücke zurück, werden nur 5 protokolliert. Also logge ich die Zeigeradresse der Zelle aus, die gelöscht wurde, für zukünftige Referenz. Nun, wenn ich die Ausführung an einem beliebigen Punkt zurückgehen und Pause, kann ich in die LLDB Aufforderung eingeben:

po 140382950334240 
<TableLeakCell: 0x7fe67852a490; baseClass = UITableViewCell; frame = (-375 176; 375 44); text = 'Chris'; hidden = YES; autoresize = W; gestureRecognizers = <NSArray: 0x7fe678530d70>; layer = <CALayer: 0x7fe67852a860>> 

Diese Zuordnung aufgehoben werden soll! Die x.position der Zelle ist genau -(tableView.width) und hidden=YES. Wie in der Zelle ist noch in der Position, nachdem die Animation beendet ist. Oder vielleicht wird es zur Wiederverwendung in die Warteschlange gestellt? So oder so, es ist für immer da, und es gibt nichts in Apples Dokumentation über das manuelle Zerstören einer Zelle nach dem Aufruf von deleteRowsAtIndexPaths.

Schnell Proof of Concept Projekt hier: https://github.com/iOSDigital/UITableViewLeak

+0

Schöne Demo. Einen Fehlerbericht mit Apple einreichen! – matt

Antwort

0

Mindestens Xcode 7.2/iOS 9.2 Simulator und Xcode 7.3/iOS 9.3 Device alle Zellen mit bekommen deallokierten. Nur ändern ist die Reihenfolge der Freigabe, die gelöschte Zelle wird zuletzt freigegeben.