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
Schöne Demo. Einen Fehlerbericht mit Apple einreichen! – matt