我有一个奇怪的错误,我不确定如何追踪。我正在Simmulator 3.0中运行一个应用程序。它在tabBarcontroller上有三个选项卡,我们称之为tab1,tab2和tab3。所有三个选项卡都是自定义分组表的子类。如果我无限期地在tab1和tab3之间来回点击,就没有问题。但是,如果我从tab1或tab3到tab2单击五次,则在单击tab1或tab3后程序崩溃。当我这样做时,我有两种不同的回溯(大多数是相同的):
backtrace1:
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
backtrace2:
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之外,我没有在回溯中看到我的任何代码。回溯中指示的主要代码行是
int retVal = UIApplicationMain(argc, argv, nil, @"AnAppDelegate");
我应该从哪里开始寻找解决此错误的方法?
答案 0 :(得分:1)
基于堆栈跟踪,看起来操作系统已完成从一个视图到另一个视图的转换,并且正在尝试清除已经解除分配的内容。我的猜测是你的应用程序和操作系统都有一些东西,但你已经释放了你的一面,而不是保留它,导致操作系统的后续释放崩溃。第一个回溯是双重释放 - 释放已经释放的对象;第二种是尝试向不再存在的对象发送消息。
答案 1 :(得分:0)
(无法发表评论所以我不得不使用答案位)
我也有类似的问题,也使用自定义表格单元格。我的单元格被创建based on the tutorial found here(前进12:02是最相关的):
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"MyTableCellView" owner:self options:nil];
cell = self.myTableCell;
}
我有MyTableCellView.xib
,其所有者指向TableViewController
。控制器有一个myTableCell
IB插座。
我没有任何问题/泄漏。 Clang / LLVM没有问题。我正在模拟器中使用“模拟内存警告”进行压力测试。该应用程序每次都会崩溃,并出现与您类似的错误。
修改的
终于明白了!
好吧,我不知道你应该IBOutlet
didReceiveMemoryWarning
中的viewDidUnload
nil(类似于{{1}})。
最好在翻转之前重新出现,以便在内存通知后回到主视图时没有“flickr”。