【问题标题】:ios app is crashingios应用程序崩溃
【发布时间】:2010-12-13 22:45:21
【问题描述】:

我的应用程序崩溃时遇到问题。主根控制器是一个选项卡控制器。在选项卡控制器内,我有 4 个按钮,其中连接了一个导航控制器。在导航控制器内部,我有一个带有几个单元格的表格控制器。当您单击一个单元格时,它会将您带到一个视图控制器。现在,当我单击单元格时,它会将我带到视图控制器。当我单击导航控制器上的后退箭头时,它会将我带回到表格视图,这很棒,但是当我单击新单元格时,应用程序崩溃了。每次我单击一个单元格,返回并单击另一个单元格时,应用程序就会崩溃。我究竟做错了什么?我想我太在乎我所有的发布了。不过不确定。

运行程序时出现错误。上面写着:

Book Nav Controller(Medical How To's)将其“NIB Name”属性设置为“BookTableViewController.nib”,但此视图控制器不打算以这种方式设置其视图。

我还发现此代码不推荐使用 setText:

cell.text = [breakdownArray objectAtIndex:row];

我要改成什么?

另外我的 didSelectRowAtIndexPath 代码是:

NSInteger row = [indexPath row];
if (self.bookDetailViewController == nil); {
    BookDetailViewController *aBookDetail = [[BookDetailViewController alloc] initWithNibName:@"BookDetailView" bundle:nil];
    self.bookDetailViewController = aBookDetail;

    [aBookDetail release];

}

bookDetailViewController.title = [NSString stringWithFormat:@"%Breakdown" , [breakdownArray objectAtIndex:row]];

Surviving2012AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.breakdownNavController pushViewController:bookDetailViewController animated:YES];

[delegate release];

}

【问题讨论】:

  • 您没有提及您的平台/操作系统/框架/编程语言。请添加更多详细信息。按照本指南,您可以大大提高您的提问技巧:tinyurl.com/so-hints
  • 请格式化代码,放置正确的标签和正确的问题标题。
  • 要摆脱不推荐使用的方法警告,请使用 cell.textLabel.text 而不是 cell.text。另外,不要调用 [delegate release]
  • ...它起不来了!

标签: iphone ios crash


【解决方案1】:
cell.text = [breakdownArray objectAtIndex:row];

应该是:

cell.textLabel.text = [breakdownArray objectAtIndex:row];

bookDetailViewController.title = [NSString stringWithFormat:@"%Breakdown" , [breakdownArray objectAtIndex:row]];

应该是:

bookDetailViewController.title = [NSString stringWithFormat:@"%@", [breakdownArray objectAtIndex:row]];

如果您从 tabBarController 中的一个 viewController 调用它,那么:

Surviving2012AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
[delegate.breakdownNavController pushViewController:bookDetailViewController animated:YES];
[delegate release];

应该是:

[self.navigationController pushViewController:bookDetailViewController animated:YES];

如果在那之后它仍然崩溃,那么您需要发布您的定义方式:

.h 文件中的 bookDetailViewController,以及 viewWillAppear 和 viewDidLoad 方法的内容。

【讨论】:

    【解决方案2】:

    至于你不推荐使用的方法:

    改成:

    cell.textlabe.text = [breakdownArray objectAtIndex:row];
    

    我不明白这一点:

     Surviving2012AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
    [delegate.breakdownNavController pushViewController:bookDetailViewController animated:YES];
    
    [delegate release];
    

    你说你在每个标签中都有一个导航控制器?那你为什么不用它?

    [self.navigationController pushViewController:bookDetailViewController
    
    
    animated:YES];
    

    【讨论】:

    • 我确实使用导航控制器。我在导航控制器中有一张桌子。我单击一个单元格。它带我进入表格视图。然后我按回导航,当我单击一个新单元格时。应用崩溃。
    • Y 我只是说,我不认为你必须创建一个额外的 navController,因为你的类中已经可以有一个。但我不知道你的代码,如果事情是这样的,最好不要改变它(“永远不要改变正在运行的系统”^^)。但是看看我上面的评论并添加自动释放以防止内存泄漏
    【解决方案3】:

    Apple 的 iOS 参考库——在 Xcode 中的 Help->Developer Documentation 下提供——非常清楚地列出了用以下内容替换已弃用的 .text 属性:.textLabel and .detailTextLabel

    【讨论】:

      【解决方案4】:

      绝对不要在委托上调用 release。 只有在对象上使用了包含以下内容的方法时,才在对象上调用 release: alloc/init、复制、新建或保留。否则你可能会释​​放一个自动释放的实例,这会导致它崩溃。

      解决这个问题,如果仍然发生,请发布您的结果,我们会再看看。

      【讨论】:

      • 是的,它停止崩溃了!!谢谢!但这会在以后使用应用程序时导致内存泄漏或其他问题吗?
      • 您可以通过将代码更改为来使用自动释放调用: Surviving2012AppDelegate *delegate = [[[UIApplication sharedApplication] delegate]autorelease];通过这个你的程序处理发布。
      • 它不会导致泄漏,因为它是一个自动释放的对象。如果它在标题中有新副本或分配/初始化,那么您将获得该对象的所有权并且不得不担心管理内存。如果您不拥有它,那么不要释放它。您需要了解的有关内存管理的所有信息都可以在这里找到:interfacelab.com/objective-c-memory-management-for-lazy-people
      猜你喜欢
      • 2012-03-27
      • 2013-07-07
      • 2016-09-22
      • 2016-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多