Objective c 在选项卡之间切换5次时程序崩溃
我有一只奇怪的虫子,我不知道如何找到它。我正在Simulator 3.0中运行一个应用程序。tabBarcontroller上有三个选项卡,我们称它们为tab1、tab2和tab3。所有三个选项卡都是自定义分组表的子类。如果我无限期地在tab1和tab3之间来回单击,就不会有问题。但是,如果我从tab1或tab3到tab2恰好单击了五次,那么在单击tab1或tab3后程序就会崩溃。当我这样做时,我有两个不同的回溯(基本相同): 回溯1:Objective c 在选项卡之间切换5次时程序崩溃,objective-c,iphone-sdk-3.0,Objective C,Iphone Sdk 3.0,我有一只奇怪的虫子,我不知道如何找到它。我正在Simulator 3.0中运行一个应用程序。tabBarcontroller上有三个选项卡,我们称它们为tab1、tab2和tab3。所有三个选项卡都是自定义分组表的子类。如果我无限期地在tab1和tab3之间来回单击,就不会有问题。但是,如果我从tab1或tab3到tab2恰好单击了五次,那么在单击tab1或tab3后程序就会崩溃。当我这样做时,我有两个不同的回溯(基本相同): 回溯1: objc[2988]: FREED(id): messag
objc[2988]: FREED(id): message release sent to freed object=0xfec100
Program received signal: “EXC_BAD_INSTRUCTION”.
(gdb) backtrace
#0 0x92a2dbfa in _objc_error ()
#1 0x92a2dc30 in __objc_error ()
#2 0x92a2c637 in _freedHandler ()
#3 0x302042e8 in CFRelease ()
#4 0x00370c31 in CALayerUpdateSublayers ()
#5 0x0036f173 in -[CALayer dealloc] ()
#6 0x0036100e in CALayerRelease ()
#7 0x00369dad in CALayerFreeTransaction ()
#8 0x003620b8 in CA::Transaction::commit ()
#9 0x0036a2e0 in CA::Transaction::observer_callback ()
#10 0x30245c32 in __CFRunLoopDoObservers ()
#11 0x3024503f in CFRunLoopRunSpecific ()
#12 0x30244628 in CFRunLoopRunInMode ()
#13 0x32044c31 in GSEventRunModal ()
#14 0x32044cf6 in GSEventRun ()
#15 0x309021ee in UIApplicationMain ()
#16 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14
回溯2:
Program received signal: “EXC_BAD_ACCESS”.
(gdb) backtrace
#0 0x92a3d688 in objc_msgSend ()
#1 0x302042e8 in CFRelease ()
#2 0x00370c31 in CALayerUpdateSublayers ()
#3 0x0036f173 in -[CALayer dealloc] ()
#4 0x0036100e in CALayerRelease ()
#5 0x00369dad in CALayerFreeTransaction ()
#6 0x003620b8 in CA::Transaction::commit ()
#7 0x0036a2e0 in CA::Transaction::observer_callback ()
#8 0x30245c32 in __CFRunLoopDoObservers ()
#9 0x3024503f in CFRunLoopRunSpecific ()
#10 0x30244628 in CFRunLoopRunInMode ()
#11 0x32044c31 in GSEventRunModal ()
#12 0x32044cf6 in GSEventRun ()
#13 0x309021ee in UIApplicationMain ()
#14 0x0000208a in main (argc=1, argv=0xbfffefbc) at /Users/johnbulcher/Documents/myApps/AnApp/main.m:14
我还没有能够复制backtrace1,尽管backtrace2和时钟一样一致。这次坠机有两件奇怪的事:
1) 使用“tabBarController.selectedIndex”以编程方式在选项卡之间切换
不会使应用程序崩溃-我必须手动选择选项卡以使应用程序崩溃。
2) 除了main之外,我没有在回溯中看到我的任何代码。回溯中指示的main中的代码行为
int retVal = UIApplicationMain(argc, argv, nil, @"AnAppDelegate");
我应该从哪里着手解决这个bug呢?根据堆栈跟踪,操作系统似乎已经完成了从一个视图到下一个视图的转换,并且正在尝试清理一些已经解除分配的内容。我的猜测是,你的应用程序和操作系统都在坚持某些东西,但你发布的内容多于保留的内容,导致操作系统的后续发布崩溃。第一个回溯是双重释放,释放已经释放的对象;第二个是尝试向不再存在的对象发送消息。(无法评论,因此我不得不使用应答槽) 我有一个类似的问题,也使用自定义表格单元格。我的单元格已创建(向前12:02分钟最相关): 我有一个
MyTableCellView.xib
,它的所有者指向TableViewController
。控制器有一个myTableCell
IB插座
我没有任何问题/漏洞。Clang/LLVM显示没有问题。我正在模拟器中用“模拟内存警告”进行压力测试。每次应用程序崩溃时都会出现与您类似的错误
编辑
终于明白了
嗯,我不知道您应该在direceivememorywarning
(类似于viewDidUnload
)中取消IBOutlet
s
最好让它在翻转之前重新出现,这样在内存通知后返回主视图时就不会出现“flickr”。我想我已经找到了问题所在。我在所有三个选项卡中使用自定义单元格,并使用-autorelease创建单元格。然而,在tab2中,只做了如下操作:TitledCell*aCell=[[codeToInitCell]autorelease];单元格=aCell;,而在tab1和tab3中,我直接设置单元格。我猜aCell是“在将来的某个时候”发布的,但该应用程序随后试图发布cell。听起来对吗?是的,那可能是罪魁祸首。
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"MyTableCellView" owner:self options:nil];
cell = self.myTableCell;
}