Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在选项卡之间切换5次时程序崩溃_Objective C_Iphone Sdk 3.0 - Fatal编程技术网

Objective c 在选项卡之间切换5次时程序崩溃

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

我有一只奇怪的虫子,我不知道如何找到它。我正在Simulator 3.0中运行一个应用程序。tabBarcontroller上有三个选项卡,我们称它们为tab1、tab2和tab3。所有三个选项卡都是自定义分组表的子类。如果我无限期地在tab1和tab3之间来回单击,就不会有问题。但是,如果我从tab1或tab3到tab2恰好单击了五次,那么在单击tab1或tab3后程序就会崩溃。当我这样做时,我有两个不同的回溯(基本相同):

回溯1:

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;
 }