2015-12-03 16 views
8

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

+0

Ładna prezentacja. Złóż raport o błędzie w Apple! – matt

Odpowiedz

0

Przynajmniej użyciu Xcode 7.2/iOS 9.2 Simulator i Xcode 7.3/iOS 9.3 Device wszystkie komórki dostać zwalniane. Zmienia się tylko kolejność deallokacji, a usunięta komórka jest ostatnia.