2014-09-29 16 views
12

Mam problem z tym sporadycznym problemem awarii na moim UITableView, który ma UICollectionViews.UIScrollView crash wewnętrznej spójności

mam panelu nawigacyjnego, którego główny widok kontroler posiada:

  1. UITableView z 3 części
  2. Każda sekcja posiada jeden rząd
  3. Każdy rząd ma UICollectionView
  4. Górny rząd UITableView (który jest widokiem kolekcji) został stworzony do automatycznego przewijania w oparciu o NSTimer.

Katastrofa występuje, gdy popchnę do kontrolera nawigacyjnego i wyskoczy w przód iw tył. Zdarza się, kiedy nie pchania i popping 3-4 razy

Ślad:

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 

Odpowiedz

24

myślę, że to błąd gdzieś na iOS 8 dotyczące harmonogramu UITableViewController (lub zwykły UIViewController zawierający UITableView) dealloc gdy jest radzenie sobie z animacjami przejścia. W jakiś sposób kontroler widoku jest już zwolniony, ale widok tabeli nadal próbuje wysłać wiadomości do swojego delegata .

Jako obejście, można zaimplementować metodę dealloc na UITableViewController tak:

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

Ten błąd nie tylko występujących w systemów iOS 8. Otrzymuję zgłoszenia Crashlytics na ten temat z iOS8.1.3 i iOS7.1.2, iPad 2 i iPad Mini. Ale 90% iOS8 rzeczywiście. Ponieważ wyjątek nie rzuca się na moje urządzenie i moje symulatory, muszę poczekać na kolejne wydanie App Store, aby sprawdzić, czy rzeczywiście naprawił ten błąd. –

+1

@RobvanderVeer dlaczego nie profilujesz swojej aplikacji z instrumentami i nie sprawdzasz zombie? Możesz też uruchomić aplikację na rozłączonym iPhonie - załóż awarię aplikacji, a następnie połącz się z powrotem, otwórz Urządzenia z Xcode i powinieneś zobaczyć dzienniki awarii. –

+1

Dzięki @IslamQ, udało mi się odtworzyć awarię przez ciężkie przewijanie przewijania, a następnie przełączanie widoków szybko. Moja ostatnia aktualizacja zawierała poprawkę dealloc na wszystkich moich kontrolerach widoku tableView i wszystkie podobne awarie zniknęły, w tym iOS7, 8, 8.1 i 8.2beta –