导航控制器动画期间iPhone崩溃,我的选择是什么?

时间:2010-12-27 13:50:28

标签: iphone ios crash

在我的应用中寻找间歇性崩溃。最后揭开了我的崩溃报告象征性的秘密,这就是我发现的:

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

正如您所看到的,在导航视图控制器转换的动画期间,这一切都发生在库代码中。这似乎发生在导航回来。

关于可能导致这种情况的任何想法,我可以控制和寻找什么?

一些答案​​后更新

我有这个“模式”,我重复使用视图控制器来显示不同查询的结果。我的代码有3个指向FetchedResultsController个实例的指针,它有一个属性currentResults,指向当时正在使用的属性。

.h档案:

@interface MyViewController : UITableViewController <NSFetchedResultsControllerDelegate> {

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

  // and other things unrelated
}

@property (nonatomic, retain) NSFetchedResultsController *currentController;

.m档案:

-(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中发布了一个版本。 但是,因为我有两个引用它,这对我来说似乎没问题。

4 个答案:

答案 0 :(得分:1)

当我发布一个不应该发布的对象时,我会遇到这些错误 - 请检查您的发布操作。

答案 1 :(得分:1)

看起来在此动画期间即将消失的视图控制器被过度释放。检查以确保您没有多次释放视图控制器。

答案 2 :(得分:0)

.xib是否正确映射?如果您使用tableView,请检查didSelectRowAtIndexPath:部分是否存在任何问题。

答案 3 :(得分:0)

我最近遇到过这个问题,因为我遇到了同样的问题,这个答案对我来说根本没有帮助。

结果是问题是,在从UINavigationController弹出的视图中,每次都设置了一个视图变量。

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

该视图将覆盖前一个视图,即使它已经存在,也将其添加到subView中。如果旧视图仍然存在,则会创建一个孤立视图并导致崩溃。解决方案是确保如果存在该视图,则在重新创建之前将其从superview中删除。

    [resultsVC.view removeFromSuperview];
    resultsVC = nil;

希望这有助于追随我的人!感谢