2015-12-03 13 views
8

Mi chiedo se in qualche modo si sia imbattuto in un errore in cui strisciare per eliminare UITableViewCells non rilasciarlo mai quando lo fa il proprio UITableViewController.deleteRowsAtIndexPaths: scorrere per eliminare le righe non rilascia la cella in modo definitivo?

Ho aggiunto un metodo -dealloc nella mia cella di tabella personalizzata, che registra un messaggio. Quando torno indietro sul controller di navigazione, tutti e 6 i messaggi vengono disconnessi.

Se si scorre per cancellare uno (o più), e premere indietro, vengono registrati solo 5. Quindi cancello l'indirizzo del puntatore della cella che è stata cancellata, per riferimento futuro. Ora, quando vado indietro e mettere in pausa l'esecuzione in qualsiasi punto, posso entrare nel prompt lldb:

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

Questo avrebbe dovuto essere deallocato! Il x.position della cella è esattamente -(tableView.width) e hidden=YES. Come nella cella è ancora nella posizione dopo che l'animazione è finita. O forse è in coda per il riutilizzo? In ogni caso, è lì per sempre, e non c'è nulla nella documentazione di Apple sulla necessità di distruggere manualmente una cella dopo aver chiamato deleteRowsAtIndexPaths.

Quick Proof of concept di progetto qui: https://github.com/iOSDigital/UITableViewLeak

+0

Bella demo. Segnala un bug report con Apple! – matt

risposta

0

Almeno utilizzando Xcode 7.2/iOS 9.2 Simulator e Xcode 7.3/iOS 9.3 Device tutte le cellule ottenere deallocato. Solo il cambiamento è l'ordine di deallocazione, la cella eliminata è stata deallocdata per ultima.