【发布时间】:2011-03-06 19:13:18
【问题描述】:
我被这条错误消息卡住了,因为三天来我没有找到对象 _cfTypeID,也没有在该消息之后记录对象的地址。我知道一定有一个我可以访问的数组,但它已经被销毁了。
我的 iPhone 应用程序基于一个标签栏控制器,通过一个标签我切换到一个新的视图控制器,它创建一个导航视图控制器并隐藏整个标签栏控制器以防止被访问。我选择这种方式是因为整个标签栏视图逻辑以纵向运行,而导航视图控制器以横向运行。
当它通过标签栏从任何纵向视图开始时,第一次运行总是很好,然后更改为导航视图控制器的横向视图。我在导航堆栈上推送了三个视图。在第一次运行时,当我导航回根控制器时也没有崩溃,保持打开状态并返回标签栏控制器的最后一个可见视图。此时导航视图控制器将被释放。
崩溃发生在第二次运行时,再次从标签栏控制器导航到导航视图控制器,再到第三个推送视图控制器。此时导航视图控制器及其堆栈上的三个视图控制器被重新创建。当我通过按我创建为完成按钮的 backBarButton 或 rightBarButton 离开堆栈中最底部的视图时发生崩溃。
我还没有找到我对内存管理不满意的地方,因为我自己没有一个名为 _cfTypeID 的数组,也没有直接访问这个数组。 GDB 在调用 NSUserDefaults 同步期间崩溃,我在刚刚离开屏幕的视图的 viewWillDisappear 中使用该 NSUserDefaults。带有泄漏工具的仪器会在此崩溃后终止进程,并且它的消息对我没有帮助。
...在模拟器和设备(iPhone 4)上运行之间存在行为差异:在设备上,我可以从导航视图控制器中再弹出一个视图控制器,并在离开时崩溃backBarButton 的视图。
我决定不发布任何代码行,因为其中有很多代码行,将其放在这里可能没有意义。但如果需要,我可以提供其中的一部分。我很高兴能提供一些工具提示,我可以用来识别损坏的数组或其他任何东西来修改我的内存管理(这当然不是完美的,因为我对来自 c++ 和 php 的 objc 还很陌生)。
干杯, 康兰
【问题讨论】:
-
该错误肯定与您实现的数组有关,并且没有足够的保留。如果您实现了一个自动释放数组并且忘记了您以后需要它,这尤其常见。尝试使用调试器/工具来查找问题。
-
谢谢,但问题是我拥有的所有数组都没有名称 _cfTypeID ...我根本找不到该名称的任何引用。因此,到目前为止,所有调试器/仪器活动都失败了。我在创建后和销毁导航视图控制器之前使用地址和保留计数记录了所有视图控制器实例、数组和字典。一切看起来都不错(保留计数 2,导航视图控制器 3),除了第一个视图控制器使用 [self.theCtrl pushViewController:viewControl animated:NO]; 推送到堆栈上,其保留计数为 27和 2 在我销毁它之前。