在标签之间切换5次时程序崩溃

时间:2009-08-21 22:14:15

标签: objective-c iphone-sdk-3.0

我有一个奇怪的错误,我不确定如何追踪。我正在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");

我应该从哪里开始寻找解决此错误的方法?

2 个答案:

答案 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”。