2014-09-29 14 views
12

Sono alle prese con questo problema di arresto anomalo intermittente sul mio UITableView che ha UICollectionViews.Arresto di coerenza interna UIScrollView

Ho un controller di navigazione cui radice vista del regolatore un'ampia

  1. UITableView con 3 sezioni
  2. Ogni sezione ha una fila
  3. Ogni riga ha un UICollectionView
  4. La riga superiore di UITableView (che è una vista insieme) viene fatto scorrere automaticamente in base a NSTimer.

L'arresto anomalo si verifica quando si inserisce il controller di navigazione e si apre e indietro. Succede quando faccio spingere e popping 3-4 volte

La traccia:

Thread 0 Crashed: 
0 libobjc.A.dylib     0x38f74626 objc_msgSend + 6 
1 UIKit       0x312a6740 -[UIScrollView(UIScrollViewInternal) _notifyDidScroll] + 60 
2 UIKit       0x31020798 -[UIScrollView setContentOffset:] + 600 
3 UIKit       0x312a76b6 -[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 1394 
4 UIKit       0x310d33d2 -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 414 
5 UIKit       0x310d322a -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:] + 26 
6 UIKit       0x310d31e2 -[UIScrollView removeFromSuperview] + 26 
7 UIKit       0x31001952 -[UIView dealloc] + 374 
8 CoreFoundation     0x2e700140 CFRelease + 556 
9 CoreFoundation     0x2e70b668 -[__NSArrayM dealloc] + 156 
10 libobjc.A.dylib     0x38f79b66 objc_object::sidetable_release(bool) + 170 
11 libobjc.A.dylib     0x38f7a0ce (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 354 
12 CoreFoundation     0x2e70347c _CFAutoreleasePoolPop + 12 
13 CoreFoundation     0x2e798f0e __CFRunLoopRun + 1310 
14 CoreFoundation     0x2e703724 CFRunLoopRunSpecific + 520 
15 CoreFoundation     0x2e703506 CFRunLoopRunInMode + 102 
16 GraphicsServices    0x336726ce GSEventRunModal + 134 
17 UIKit       0x3106486c UIApplicationMain + 1132 
18 BoatSenzeDev     0x00110648 main (main.m:16) 
19 libdyld.dylib     0x39468ab4 start + 0 

risposta

24

Penso che ci sia un bug da qualche parte su iOS 8 per quanto riguarda i tempi di UITableViewController (o semplice UIViewController contenente un UITableView) dealloc quando occuparsi di animazioni di transizione. In qualche modo il controller della vista è già stato deallocato, ma la vista tabella sta ancora tentando di inviare messaggi al suo delegato .

Per risolvere il problema, è possibile implementare il metodo dealloc sul UITableViewController come questo:

- (void)dealloc 
{ 
    self.tableView.delegate = nil; 
    self.tableView.dataSource = nil; 
} 
+1

Questo bug non è solo accadendo in iOS 8. Sto ottenendo rapporti su Crashlytics su questo da iOS8.1.3 e iOS7.1.2, iPad 2 e iPad Mini. Ma il 90% di iOS8 in effetti. Poiché l'eccezione non getta sul mio dispositivo e sui miei simulatori, devo aspettare un'altra release di App Store per verificare che ciò abbia effettivamente risolto l'errore. –

+1

@RobvanderVeer perché non profili la tua app con gli strumenti e controlli gli zombi? Oppure puoi eseguire l'app sul tuo iPhone disconnesso: fare in modo che la tua app si blocchi, quindi riconnettersi, aprire Dispositivi da Xcode e dovresti riuscire a vedere i registri degli arresti anomali. –

+1

Grazie a @IslamQ, sono riuscito a riprodurre l'arresto con uno scrolling pesante sulla scrollview e quindi passare rapidamente alle visualizzazioni. Il mio ultimo aggiornamento includeva la correzione dealloc su tutti i miei controller di visualizzazione di TableView e tutti i relativi arresti anomali sono scomparsi, inclusi iOS7, 8, 8.1 e 8.2beta –