【问题标题】:How can I tell if my view controller will be released from memory?如何判断我的视图控制器是否会从内存中释放?
【发布时间】:2023-03-10 05:33:01
【问题描述】:

这个问题是针对使用 Xcode 的 Master Detail 模板和 Core Data 的 iPhone 应用程序。该应用支持 iOS 5.1 及更高版本。

我正在使用 NSFetchedResultsController 来管理 UITableView 中的项目,这是我的 UINavigationController 堆栈中的第二个视图控制器。用户从表视图中选择,堆栈中的第三个视图控制器被推送到视图上。非常标准的东西,我很享受 NSFetchedResultsController 提供的对 Core Data 对象的简化访问。

在第三个视图控制器中,用户正在查看从表视图中的列表中选择的一组数据。我在此视图中添加了几个按钮,用于导航到上一组或下一组数据。想想看电子邮件时看到的 iOS 邮件应用程序和向上/向下按钮。您可以使用这些按钮选择列表中的下一封或上一封电子邮件,而无需导航回电子邮件列表(表格视图)。

我试图找到最简单的方法来确定当点击这些下一个/上一个按钮之一时应该从数据存储中加载哪些数据。据我所知,这是使用堆栈中前一个视图控制器的获取结果控制器。我可以简单地让 Core Data 返回表格视图中下一个或上一个索引路径的结果。

在我的第三个(详细)视图控制器中,我能够访问第二个(主)视图控制器的获取结果控制器,如下所示:

NSFetchedResultsController *fetch = [[self.navigationController.viewControllers objectAtIndex:1] fetchedResultsController];
NSIndexPath *indexPath = [fetch indexPathForObject:self.detailItem];
NSLog(@"Section: %d, Row: %d", indexPath.section, indexPath.row);

在我继续之前,我需要知道视图控制器及其获取的结果控制器将始终存在。据我了解,它将一直保留到内存不足时才可以释放。我的详细视图在显示其数据时可能会消耗大量内存,并且随着时间的推移,应用程序用于收集更多数据时会消耗越来越多的内存。

当我的用户与详细视图控制器交互时,我能否确定这些项目(堆栈中的前一个视图控制器及其获取的结果控制器)将保留在内存中?

如果没有,我有办法确保它们被保留吗?

否则,我是否有更简单或更优雅的方式来实现目标?

【问题讨论】:

    标签: iphone ios uitableview uinavigationcontroller nsfetchedresultscontroller


    【解决方案1】:

    你的第二个视图控制器永远不会被释放。也不是在内存不足的情况下。可能发生的情况是,viewDidUnload(在 iOS 6 中已弃用且不再调用)在内存不足的情况下被调用。因此,只要您不以这种方法摆脱 NSFetchedResultsController 就应该没问题。

    【讨论】:

    • 如果是真的,那就太让人放心了!您有什么可以指出的(在文档等中)可以确认的吗?谢谢。
    • 首先保留viewControllers 属性(有copy)。因此,所有推送到导航控制器中的视图控制器都被保留,并且保留的对象永远不会被释放。如果它会释放这些控制器,则会产生一个巨大的问题,因为当您导航回已释放的控制器时,您的应用会做什么?
    【解决方案2】:

    你可以知道这个方法什么时候调用的:

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多