当我执行[self.navigationController popViewControllerAnimated:YES]时,我的应用程序崩溃。
它在设备上比在模拟器上崩溃更多。请建议如何解决这个问题?
Date/Time: 2010-11-09 10:51:41.325 +0800 OS Version: iPhone OS 4.0.1 (8A306) Report Version: 104 Exception Type: EXC_BAD_ACCESS (SIGBUS) Exception Codes: KERN_PROTECTION_FAILURE at 0x00000000 Crashed Thread: 0 Thread 0 Crashed: 0 libobjc.A.dylib 0x0000286e objc_msgSend + 18 1 CoreFoundation 0x00002c30 -[NSObject(NSObject) release] + 24 2 libobjc.A.dylib 0x00003c1a objc_setProperty + 114 3 UIKit 0x000693d4 -[UINavigationController setDisappearingViewController:] + 24 4 UIKit 0x0007d5c0 -[UINavigationController _clearLastOperation] + 40 5 UIKit 0x0007d4b4 -[UINavigationController navigationTransitionView:didEndTransition:fromView:toView:] + 556 6 UIKit 0x0007d248 -[UINavigationTransitionView _notifyDelegateTransitionDidStopWithContext:] + 204 7 UIKit 0x0007d0b6 -[UINavigationTransitionView _navigationTransitionDidStop] + 450 8 UIKit 0x00059974 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] + 184 9 UIKit 0x0005987e -[UIViewAnimationState animationDidStop:finished:] + 34 10 QuartzCore 0x000127ba run_animation_callbacks(double, void*) + 286 11 QuartzCore 0x0001265c CA::timer_callback(__CFRunLoopTimer*, void*) + 116 12 CoreFoundation 0x00071a54 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 8 13 CoreFoundation 0x00073ede __CFRunLoopDoTimer + 854 14 CoreFoundation 0x0007485e __CFRunLoopRun + 1082 15 CoreFoundation 0x0001d8e4 CFRunLoopRunSpecific + 224 16 CoreFoundation 0x0001d7ec CFRunLoopRunInMode + 52 17 GraphicsServices 0x000036e8 GSEventRunModal + 108 18 GraphicsServices 0x00003794 GSEventRun + 56 19 UIKit 0x000062a0 -[UIApplication _run] + 396 20 UIKit 0x00004e10 UIApplicationMain + 664 21 tenpay 0x00006124 main (main.m:13) 22 tenpay 0x00002324 start + 44
答案 0 :(得分:2)
myviewcontroller = [[[MyViewController alloc]init]autorelease];
[self.navigationController pushViewController:myviewcontroller animated:YES];
[myviewcontroller release]; //This is my bug !!! I just fixed it.
答案 1 :(得分:1)
这通常意味着您正在向已发布的对象发送消息,这是个坏主意。
从堆栈中可以看到它正在向对象发送释放消息。我建议该对象已被释放,因此保留计数为0.因此,进一步释放将无效。
我相信如果你打开一个标志,我认为它被称为僵尸检测或类似的东西,那么任何发布对象的消息都会产生更具描述性的信息。
也许更有经验的开发人员可以在这里了解更多细节。
答案 2 :(得分:1)
是的,我相信德里克指出了你正确的方向。您是否可以在发送此版本消息之前列出您在活动控制器上执行的与内存相关的操作类型(当您尝试将其弹出时,将隐式发送释放消息)。请澄清您是否正在为此控制器使用自动释放等...此外,查看您可能与此控制器关联的相关属性可能会有所帮助(例如:@property(nonatomic,retain等...) )如果有的话。