【问题标题】:Simulate view unloaded because of low memory模拟由于内存不足而卸载的视图
【发布时间】:2011-07-05 09:30:06
【问题描述】:

我在这里关注 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 -
- (void)viewDidLoad { self.title = @"产品"; // 创建一个过滤列表,其中将包含搜索结果表的产品。 self.filteredListContent = [NSMutableArray arrayWithCapacity:[self.listContent count]]; // 如果搜索设置保存在 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 中 -
-(void)viewDidDisappear:(BOOL)动画 { // 保存搜索 UI 的状态,以便在重新创建视图时可以恢复它 self.searchWasActive = [self.searchDisplayController isActive]; self.savedSearchTerm = [self.searchDisplayController.searchBar 文本]; self.savedScopeButtonIndex = [self.searchDisplayController.searchBar selectedScopeButtonIndex]; }

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

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

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

所以我想模拟我的视图被卸载的低内存情况,以便我可以确认恢复搜索词的逻辑是否正常工作。但我失败了。

  1. 我在 viewDidLoad 中添加了跟踪;它永远不会触发超过一次,即视图从未被卸载
  2. 我使用了 iPhone 模拟器 - 模拟内存警告 - 视图也永远不会被卸载。

总结我的问题:

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

【问题讨论】:

  • “见证人”是什么意思?看到视图将如何在您的眼前消失?这不会发生,因为默认实现是检查是否可以释放视图。
  • 嗨 yan.kun,我的意思是我想看看我的视图是如何因为内存不足警告而被卸载和重新创建的。您的意思是标签栏控制器中的视图由于内存不足而永远不会被卸载? (对不起,我真的不知道)
  • 我认为他只是意味着您不能“见证”正在显示的视图的卸载。如果您想在视图中查看 didReceiveMemoryWarning 的行为,则必须在它不显示时调用该方法。

标签: iphone objective-c


【解决方案1】:

我不能肯定这个答案,但根据我的经验,它是这样工作的。

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

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

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多