由于内存不足而模拟视图已卸载

时间:2011-07-05 09:30:06

标签: iphone objective-c

我在这里关注Apple的示例代码:http://developer.apple.com/library/ios/#samplecode/TableSearch/Listings/AppDelegate_m.html#//apple_ref/doc/uid/DTS40007848-AppDelegate_m-DontLinkElementID_4

这是一个示例,说明如何使用SearchDisplayController对表进行搜索。

与我的问题相关的代码是:

  1. 在viewDidLoad -
  2.     - (void)viewDidLoad
        {
            self.title = @"Products";
    
            // create a filtered list that will contain products for the search results table.
            self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.listContent count]];
    
            // restore search settings if they were saved in didReceiveMemoryWarning.
            if (self.savedSearchTerm)
            {
                [self.searchDisplayController setActive:self.searchWasActive];
                [self.searchDisplayController.searchBar setSelectedScopeButtonIndex:self.savedScopeButtonIndex];
                [self.searchDisplayController.searchBar setText:savedSearchTerm];
    
                self.savedSearchTerm = nil;
            }
    
            [self.tableView reloadData];
            self.tableView.scrollEnabled = YES;
    
    1. 在viewDidDisappear -
    2.     -(void)viewDidDisappear:(BOOL)animated
          {
              // save the state of the search UI so that it can be restored if the view is re-created
              self.searchWasActive = [self.searchDisplayController isActive];
              self.savedSearchTerm = [self.searchDisplayController.searchBar text];
              self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex];
          }
      

      因此,它表示它正在保存搜索UI的状态,以便在重新创建视图时可以恢复它。

      它还说“如果它们保存在didReceiveMemoryWarning中,它会恢复搜索设置。”

      所以我的理解是,当内存不足时,可能会卸载此视图。当用户单击该选项卡以查看该视图时,可能会再次重新创建它。

      所以我想模拟我的视图被卸载的低内存情况,这样我就可以确认搜索术语恢复的逻辑是否有效。但我失败了。

      1. 我在viewDidLoad中添加了一条跟踪;它永远不会发射一次,即视图从未被卸载
      2. 我使用iPhone模拟器 - 模拟内存警告 - 视图永远也不会被卸载。
      3. 总结我的问题:

        1. iOS中是否会卸载标签栏控制器中的已加载视图,因为它面向内存不足?
        2. 如果上述问题的答案为是,那么iOS模拟器能够重现吗?

1 个答案:

答案 0 :(得分:0)

我不能对这个答案持肯定态度,但根据我的经验,它可以这样运作。

如果您的UIViewController注册为UITabBarController的viewControllers之一,并且UITabBarController是UIWindow的rootViewController,则应将内存警告转发给您的UIViewController。如果不是,我相信有一个缺失的过渡。要找出位置,你可以将每个UIViewController从rootViewController NSLog到你想要的UIViewController,看看它停在哪里。

现在,如果你想测试你的UIViewController的didReceiveMemoryWarning,你可以在加载另一个View或使用计时器时自己调用该方法。