【问题标题】:app crashes while rotating the device in either direction of iPAD向 iPad 的任一方向旋转设备时应用程序崩溃
【发布时间】:2013-01-08 08:23:54
【问题描述】:

让我简要介绍一下我的应用,我有根视图标签栏控制器(5 个标签),第一个视图是导航控制器;它是一个 iPad 应用程序。现在我有一个表格视图,我正在通过 CODE 制作标题。

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
 { 
    _headerScenarioIDLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
   //and many more declarations here

}

并相应地旋转视图

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 
{
    if (UIInterfaceOrientationIsLandscape(fromInterfaceOrientation))
    {// for portrait.
     _headerScenarioIDLabel.frame        = CGRectMake(-30, 2, 125, 20);
    }
   else
   { // for LandScape
          _headerScenarioIDLabel.frame        = CGRectMake(-26, 2, 125, 20);
    }
}

现在的问题是,当我启动应用程序并旋转它时,这段代码运行良好,但是当我进入导航并从导航返回时,应用程序在进一步旋转时崩溃。

线程 1 EXE 访问错误,0x1bd109b:movl 8(%edx),%edi

任何人都可以建议我在这个奇怪的崩溃中哪里错了.. ???

【问题讨论】:

  • 您是否检查过BAD ACCESS 是否是由于_headerScenarioIDLabel?尝试注释掉与_headerScenarioIDLabel相关的代码,看看它是否仍然崩溃。
  • 是的,评论代码它工作正常..
  • 那么看来_headerScenarioIDLabel 已经是autoreleased 并且您正在尝试访问旧地址位置。您应该确保再次检索_headerScenarioIDLabel 的当前值,然后再对其执行任何更多操作以进行自动旋转。
  • 是的,自动释放是崩溃的根本原因。但是伙计,我对编码不太熟悉,你能告诉我如何做到这一点.. 在此先感谢 :)
  • 如果不查看整个代码,这很难做到。您必须自己调试它,并尝试确保_headerScenarioIDLabelnot 发布的,或者它拥有正确的标签地址。同时你应该注意内存泄漏。

标签: ios ios5


【解决方案1】:

使用静态分析器检查您的代码是否存在泄漏。另外,我看到的第一件事是您正在使用自动释放对象初始化 ivar _headerScenarioIDLabel - 您需要修复此问题,因为 ivar 应该拥有指向标题视图的强指针。还要记住,-tableView:viewForHeaderInSection: 方法可以被多次调用,这就是为什么你需要在再次设置它之前释放这个 ivar。所有这些问题的简单解决方案是使用属性...并且始终使用属性,尤其是在使用手动内存管理时。

【讨论】:

  • 好吧,在删除自动释放后它可以正常工作而不会崩溃:)。 ,我也使用了属性。现在正如你所说的tableView:viewForHeaderInSection:方法可以多次调用,那么如何使用这个?并且在删除自动释放时,应用程序已锁定到启动方向(在旋转标题标签时发生变化)。我对编码不太熟悉,所以请提供更多详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多