【问题标题】:iPhone uinavigationcontroller issueiPhone uinavigationcontroller 问题
【发布时间】:2011-01-24 18:33:38
【问题描述】:

我有 2 个视图; 视图 A - 显示表格列表 - 行 a、行 b、c...(实际上是从 ext API 请求中填充的) 视图 B - 显示有关所选行的详细信息

现在假设当我第一次单击视图 A 上的行 a 时,它会将我带到 a 的详细视图(即视图 B)。之后,我返回查看 A。现在,当我单击任一行 a/b 时,它给了我一个错误; 节目接收信号:“EXC_BAD_ACCESS”

此问题并非每次都会发生。在某些情况下,我可以来回导航多次。

我的代码是:

bookdetailViewController = [[BookDetailViewController alloc] initWithNibName:@"BookDetailView" bundle:[NSBundle mainBundle]];

请帮帮我。

【问题讨论】:

    标签: iphone objective-c ios uinavigationcontroller


    【解决方案1】:

    很有可能由于时间问题,您不能总是重复它。您说屏幕是由外部 API 请求填充的。是否将详细视图设置为 API 请求的委托,以便在 API 请求完成且数据准备好时通知它?

    我建议您可以通过非常快速地从列表视图转到详细信息视图来重现错误,但在详细信息视图加载其数据之前,请返回到列表视图。如果详细信息视图是 API 请求的委托,则应用程序将崩溃,因为 API 请求的委托在能够调用您指定的任何委托消息之前已被释放。如果您给详细信息视图加载数据的时间,您将不会遇到此崩溃。

    我正在开发的应用程序中有一个类似的错误,目前正在通过一些技巧避免它 - 在详细信息视图中 dealloc:

    -(void)dealloc
    {
      [super dealloc];
      self = nil;
    }
    

    如果有人有更聪明的方法来确保将解除分配的视图设置为nil,我欢迎他们的建议。

    【讨论】:

    • [接收器发布];接收者=无;对于 ivars receiver.property = nil;一直以来的物业
    【解决方案2】:

    我过去也遇到过类似的问题,通常最终是我释放了一个对象而没有保留它。具体来说,您可能需要为此检查视图和单元格。

    【讨论】:

    • 我确实检查过了。我没有发布任何正在使用的 obj。例如视图/单元事实上,我并没有在大多数事情上使用保留/释放。
    • 很难调试程序接收到的信号:“EXC_BAD_ACCESS”。因为它没有提供任何具体信息
    • 只是补充一下,我还将一些信息从视图 A 传递到视图 B aBook = [appDelegate.books objectAtIndex:indexPath.row]; bookdetailViewController.aBook = aBook; [self.navigationController pushViewController:bookdetailViewController 动画:YES];
    • 我注意到的另一件事是有时在显示详细视图时会出现不一致:例如在第二次,如果我点击 b 行,它会显示 c 的详细信息...这通常只发生在第二次(即来回之后)
    • 您正在尝试访问已释放的内存。调试器是否为您提供任何线索?寻找带有黑色字母的方法,这通常是您的方法,也是您的应用程序崩溃的地方。听起来可能是 [appDelegate.books objectAtIndex:indexPath.row] 导致您的问题,如果您尝试访问不存在对象的索引处的对象。还有一点需要注意的是:将对象模型保存在 App Delegate 中并不是一个很好的选择。查看一些 MVC 文档(或 WWDC 视频,如果您有付费开发者帐户)
    【解决方案3】:

    为了给您最好的答案,有必要查看您的 viewDidLoad:viewWillAppear: 以及可能的 tableView:didSelectRowAtIndexPath: 方法中的内容。

    用这一行:

    bookdetailViewController = [[BookDetailViewController alloc] initWithNibName:@"BookDetailView" bundle:[NSBundle mainBundle]];
    

    您正在初始化(并因此保留)BookDetailViewController 的一个实例。当您返回视图 A(我假设它是称为 BookListViewController 或 BooksViewController 的东西)时,谁在处理该版本的发布。如果没有人负责释放它,那就是那里的泄漏,它可能不会导致 EXC_BAD_ACCESS 但它不好。

    【讨论】:

    • 我应该在 BookListViewController 中释放 BookDetailViewController 吗?
    • 通常是的。通常,如果您将其推送到导航控制器堆栈上,您将推送然后调用详细视图控制器上的释放。这实质上意味着您放弃了对 bookdetailviewcontroller 的责任,并让 navigationcontroller 决定何时释放它。
    • 另一个想法:我没有看到您实际上声明了 bookdetailViewController,我看到您为其设置了一个值。你在哪里声明的?是ivar吗?它只是在didSelectRow: 方法的范围内吗?它真的可能不应该是 ivar。
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多