Сбой iPhone во время анимации контроллера навигации, каковы мои варианты? - PullRequest
3 голосов
/ 27 декабря 2010

Охотился на прерывистый сбой в моем приложении.Наконец, я раскрыл секреты символизации моего отчета о сбое, и вот что я обнаружил:

Incident Identifier: BFCE991E-5F9C-4F04-89AD-A0060EDE73D1
CrashReporter Key:   263d1a93e7ce2d75b397b6ef42b1bc4f29d22f9d
Hardware Model:      iPhone2,1
Process:         Wine Brain [2787]
Path:            /var/mobile/Applications/197DA851-3F8A-486E-8675-74B521A1FD72/Wine Brain.app/Wine Brain
Identifier:      Wine Brain
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2010-12-26 19:21:21.551 -0500
OS Version:      iPhone OS 4.2.1 (8C148a)
Report Version:  104

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x0000000d
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x3199f464 objc_msgSend + 16
1   Wine Brain                      0x0000a0b4 0x1000 + 37044
2   CoreFoundation                  0x31436f74 -[NSObject(NSObject) release] + 24
3   libobjc.A.dylib                 0x319a0812 objc_setProperty + 114
4   UIKit                           0x338f74a0 -[UINavigationController setDisappearingViewController:] + 24
5   UIKit                           0x338f7478 -[UINavigationController _clearLastOperation] + 40
6   UIKit                           0x338f7394 -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 556
7   UIKit                           0x338f7128 -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] + 204
8   UIKit                           0x338f6dee -[UINavigationTransitionView _cleanupTransition] + 450
9   UIKit                           0x338f6c18 -[UINavigationTransitionView _navigationTransitionDidStop] + 36
10  UIKit                           0x338b4330 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184
11  UIKit                           0x338c0c0e -[UIViewAnimationState animationDidStop:finished:] + 34
12  QuartzCore                      0x30a89ea2 run_animation_callbacks(double, void*) + 286
13  QuartzCore                      0x30a89d44 CA::timer_callback(__CFRunLoopTimer*, void*) + 116
14  CoreFoundation                  0x3148709c __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8
15  CoreFoundation                  0x31486b54 __CFRunLoopDoTimer + 844
16  CoreFoundation                  0x314581ae __CFRunLoopRun + 1082
17  CoreFoundation                  0x31457c80 CFRunLoopRunSpecific + 224
18  CoreFoundation                  0x31457b88 CFRunLoopRunInMode + 52
19  GraphicsServices                0x35d664a4 GSEventRunModal + 108
20  GraphicsServices                0x35d66550 GSEventRun + 56
21  UIKit                           0x338d5322 -[UIApplication _run] + 406
22  UIKit                           0x338d2e8c UIApplicationMain + 664
23  Wine Brain                      0x000021ba 0x1000 + 4538
24  Wine Brain                      0x00002184 0x1000 + 4484

Как вы можете видеть, все это происходит в коде библиотеки во время анимации перехода контроллера представления навигации.Похоже, это происходит при переходе назад.

Любые идеи о том, что может вызвать это, я могу контролировать и что искать?

Обновление после некоторых ответов

Iу меня есть этот «шаблон», посредством которого я повторно использую контроллер представления, чтобы показать результаты различных запросов.Мой код имеет, скажем, 3 указателя на FetchedResultsController экземпляров, и у него есть свойство currentResults, которое указывает на то, которое используется в тот момент.

.h file:

@interface MyViewController : UITableViewController <NSFetchedResultsControllerDelegate> {

  NSFetchedResultsController *controller1;
  NSFetchedResultsController *controller2;
  NSFetchedResultsController *controller3;

  // and other things unrelated
}

@property (nonatomic, retain) NSFetchedResultsController *currentController;

.m file:

-(void)clearAll {
  [controller1 release];
  controller1 = nil
  [controller2 release];
  controller2 = nil
  [controller3 release];
  controller3 = nil
}

Когда вызывающая сторона собирается отобразить мой контроллер вида, она сначала настраивает его для подробностей:

-(void)setupForSearch1 {
  self.currentController = [self controller1];
}
- (NSFetchedResultsController *)controller1 {

  NSFetchedResultsController *aController = [[[NSFetchedResultsController alloc] 
                                                 initWithFetchRequest:fetchRequest
                                                managedObjectContext:self.managedObjectContext 
                                                 sectionNameKeyPath:@"titleFirstLetter" 
                                                 cacheName:nil] autorelease];
  // error handling omitted for brevity
  controller1 = [aController retain];
  return controller1;
}    

Так что на самом деле это трудноя точно знаю, правильно ли я поступаю;в setupForSearch1, когда я правильно присваиваю currentController, я полагаю, что release делается на старой ссылке.И я сделал релиз на clearAll. Но , поскольку у меня do есть две ссылки на это, мне кажется, это нормально.

Ответы [ 4 ]

1 голос
/ 27 декабря 2010

Я получаю такие ошибки, когда освобождаю объект, но не должен - проверьте ваши действия по выпуску.

1 голос
/ 27 декабря 2010

Похоже, что контроллер представления, который собирается исчезнуть во время этой анимации, переиздан.Убедитесь, что вы не выпускаете контроллеры вида слишком много раз.

0 голосов
/ 24 августа 2012

Я недавно столкнулся с этим, поскольку у меня была та же самая проблема, и этот ответ действительно не помог мне вообще.

Проблема оказалась в том, что в представлении, извлекаемом из UINavigationController, была переменная для представления, которое устанавливалось каждый раз.

 resultsVC = [[ResultsTableViewController alloc]initWithSearchResults:self.resultsArray];
 [self.view addSubview:resultsVC.view];

Это представление перезапишет предыдущее, даже если оно уже существует, и добавит его в подпросмотр.Если старый вид все еще существовал, он создавал осиротевший вид и вызывал сбой.решение состояло в том, чтобы убедиться, что, если это представление существует, удалить его из суперпредставления перед его повторным созданием.

    [resultsVC.view removeFromSuperview];
    resultsVC = nil;

Надеюсь, это поможет кому-то, кто придет за мной!спасибо

0 голосов
/ 27 декабря 2010

Правильно ли сопоставлен .xib?Проверьте вашу didSelectRowAtIndexPath: деталь на наличие проблем, если вы используете tableView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...