我的问题更侧重于导航堆栈场景......我有一个,让我们说,主视图有几个表格单元格。每个单元格都会导航到新视图,方法是将其推送到导航堆栈,其视图控制器将数据和子视图存储在多个NSMutableArray
和NSArray
中。应用程序的常见流程是从主视图控制器到另一个视图控制器来回传递,这是一种常见的场景。我会理解一些关于我在这种情况下执行的内存管理操作的建议,考虑到我在ARC下:
a)我应该执行哪些“清洁”工作人员?是否建议在视图消失时清理阵列,或者在用户再次导航到视图时保留它们是否更好?
b)关于观点和子视图,当视图消失时,我是否也应该“nilify”它们?所有这些,包括nib
文件中定义的那些,或者只是我在代码中创建的那些?
谢谢
答案 0 :(得分:1)
弹出一个详细视图时,最佳做法是释放内存。如果在您的详细视图控制器中(并且仅在那里)您拥有对数据(您的集合)的强引用,它们将在pop上自动发布。
导航控制器对推送的视图控制器保持强引用,当您弹出它时,它会引用该引用。由于保持对集合的强引用的唯一对象是视图控制器本身,因此在弹出时也会释放它们。
然而,如果您的一个详细视图控制器中的数据需要时间设置(例如下载)并且用户经常返回到该视图,那么良好做法是保持它在记忆中。您可以通过在主视图控制器(表视图控制器)中保留对详细视图控制器的强引用来实现此目的。确保只创建一次重视图控制器并始终按下相同的实例。
如果您对繁重的详细信息视图控制器保持强引用以使应用程序更快,那么您应该在主表视图控制器的- (void)didReceiveMemoryWarning
中禁用该引用。如果视图控制器未被压入堆栈,则将自动回收内存。 (如果用户想再次输入,请确保重新创建视图控制器。)
回答问题b 不,通常您不会诋毁您的推荐信。如上所述,如果拥有阵列的控制器被释放,它将自动释放任何强大的属性。
如果要保留繁重的视图控制器,主表视图控制器中的代码示例:
// MainTableViewController.m
#import "MainTableViewController.h"
@interface MainTableViewController()
@property (nonatomic, strong) UIViewController *myHeavyViewController;
@end
@implementation MainTableViewController
- (UIViewController *)myHeavyViewController
{
//
// A getter for the strong myHeavyViewController property. Creates the
// view controller if needed, or returns it if it already exists.
//
if (!_myHeavyViewController) {
self.myHeavyViewController = ... // Create everything needed
}
return _myHeavyViewController;
}
- (void)didReceiveMemoryWarning
{
//
// Nil property if we get a memory warning
//
self.myHeavyViewController = nil;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath == /* Index path for the heavy view controller */) {
//
// self.myHeavyViewController always calls the getter above
//
[self.navigationController pushViewController:self.myHeavyViewController animated:YES];
}
}
@end