在我的应用中寻找间歇性崩溃。最后揭开了我的崩溃报告象征性的秘密,这就是我发现的:
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
中发布了一个版本。 但是,因为我做有两个引用它,这对我来说似乎没问题。
答案 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;
希望这有助于追随我的人!感谢