内存警告后的导航控制器堆栈问题

Posted

技术标签:

【中文标题】内存警告后的导航控制器堆栈问题【英文标题】:Navigation controller stack issue after memory warning 【发布时间】:2012-02-05 10:06:56 【问题描述】:

我在我的程序中使用 UINavigationController,当我位于导航堆栈中的第四个或第五个控制器时,程序收到内存警告并且我不能后退。我按下后退按钮,导航栏动画正在发生,但控制器没有被弹出,我仍然看到旧视图。谁能帮我解决这个问题?

我的子视图有属性:

@property (nonatomic,retain) UITableView *searchTableView;
@property (nonatomic,retain) UISegmentedControl *categorySegmentedControl;
@property (nonatomic,retain) UISearchBar *searchTableBar;
@property (nonatomic,retain) UIView *footerView;
@property (nonatomic,retain) UINavigationItem *navigationItem;

我的 viewDidUnload 方法

- (void)viewDidUnload

  [super viewDidUnload];
  self.searchTableView = nil;
  self.categorySegmentedControl = nil;
  self.searchTableBar = nil;
  self.navigationItem = nil;
  self.footerView = nil;

我的dealloc

-(void)dealloc

  [super dealloc];
  [searchTableView release];
  [categorySegmentedControl release];
  [searchTableBar release];
  [navigationItem release];
  [footerView release];
  [currentValues release];

而且我注意到奇怪的规律性 - 只有当我从不带标签栏的视图移动到带标签栏的视图时才会出现此错误。

【问题讨论】:

您的 viewController 是否正确处理 viewDidLoad 和 viewDidUnload? 是的,我的 viewDidUnload 中有 self.myIBOtlet = nil 【参考方案1】:

听起来您可能正在控制器的 viewDidLoad 中进行一些设置和/或在 viewDidUnload 中释放应该在 initWithNibName:bundle 和 dealloc 中完成的内容。

viewDidLoad 和 viewDidUnload 在创建和销毁控制器时不会被调用,它们会在创建和销毁控制器内的视图时调用,这种情况随时可能发生,尤其是当您在视图控制器时收到内存警告时在后台(例如,不是导航控制器中的顶视图)。

确保以这样一种方式编写控制器:如果 viewDidUnload 被调用,或者 viewDidLoad 被多次调用,你不会丢失数据或破坏任何东西。

对不起,如果这个答案有点含糊,但如果你发布你的视图控制器的代码,我可能会给你更具体的建议。

【讨论】:

我的 viewDidLoad 方法中没有与我的视图状态相关联的东西,但我的 viewDidUnload 方法中的所有 IBOutlet 都有 self.myIBOutlet = nil。 您是否可能在 viewDidUnload 中将一些不是视图的东西设置为 nil ?您应该只在 viewDidUnload 中将视图设置为 nil,而不是视图控制器或其他属性。尝试将您的 viewDidUnload 方法粘贴到您的问题中,我会看看。 嗯。看起来非常正确。不过不确定 self.navigationItem,你是在你的笔尖里设置的吗?通常这是自动创建的。 是的,但是 viewController 已经有一个名为 navigationItem 的属性,所以我想知道用同名之一覆盖该属性是否与出了什么问题有关。这可能不是问题,只是一个理论。 我真的不知道如何使用自定义 navigationItem 可以调用这个问题,但删除 self.navigationItem 似乎解决了我的问题!我在模拟器中模拟内存警告,它可以工作,迫不及待想明天在设备上试用它!非常感谢!

以上是关于内存警告后的导航控制器堆栈问题的主要内容,如果未能解决你的问题,请参考以下文章

iphone iOS 内存导航控制器和 ALAssetlibrary 的警告句柄

在 Swift 中清除导航堆栈

导航控制器中导航堆栈使用的数据类型是啥

iOS - 导航控制器堆栈问题

为啥我的视图在内存不足警告时消失了?

导航控制器堆栈