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

时间:2012-02-05 10:06:56

标签: iphone ios uinavigationcontroller

我在我的程序中使用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];
}

我注意到了奇怪的规律性 - 只有当我从没有标签栏的视图移动到使用标签栏查看时,才会出现此错误。

1 个答案:

答案 0 :(得分:1)

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

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

确保以这样的方式编写控制器:如果调用viewDidUnload,或者多次调用viewDidLoad,则不会丢失数据或破坏任何内容。

很抱歉,如果这个答案有点模糊,但是如果你发布视图控制器的代码,我可能会给你更具体的建议。