Zastanawiam się, czy w jakiś sposób natknąłem się na błąd, w którym przeciągnięcie, aby usunąć UITableViewCells
, nigdy nie zwolnić, gdy ich UITableViewController
robi.deleteRowsAtIndexPaths: przesuń palcem, aby usunąć wiersze, nigdy nie zwolni komórki?
Dodałem metodę -dealloc do mojej niestandardowej komórki tabeli, która wylogowuje wiadomość. Po ponownym naciśnięciu kontrolera nawigacyjnego wszystkie 6 wiadomości są wylogowane.
Jeśli przesuń palcem, aby usunąć jeden (lub więcej), i naciśnij wstecz, tylko 5 zostanie zarejestrowanych. Wylogowuję się więc z adresu wskaźnika komórki, która została usunięta, do wykorzystania w przyszłości. Teraz kiedy wrócę i wstrzymać wykonanie w dowolnym momencie mogę wejść w wierszu lldb:
po 140382950334240
<TableLeakCell: 0x7fe67852a490; baseClass = UITableViewCell; frame = (-375 176; 375 44); text = 'Chris'; hidden = YES; autoresize = W; gestureRecognizers = <NSArray: 0x7fe678530d70>; layer = <CALayer: 0x7fe67852a860>>
ten powinien być zwalniane! Jednostka x.position
komórki to dokładnie -(tableView.width)
i hidden=YES
. Tak jak w komórce jest jeszcze w pozycji po zakończeniu animacji. A może czeka w kolejce do ponownego użycia? Tak czy inaczej, jest tam na zawsze i nie ma nic w dokumentacji Apple o konieczności ręcznego niszczenia komórki po wywołaniu deleteRowsAtIndexPaths.
Szybkie dowód koncepcji projektu tutaj: https://github.com/iOSDigital/UITableViewLeak
Ładna prezentacja. Złóż raport o błędzie w Apple! – matt