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
Bella demo. Segnala un bug report con Apple! – matt