如果我有2个控制器;列表和细节控制器,处理这两个控制器的内存管理的正确方法是什么?
我的意思是在什么时候应该释放它们?
另外,如果我的列表控制器是动态的(即从ext web服务调用数据)并且一些数据被传递给详细控制器,那么我应该在哪里编写代码来检索/显示详细控制器中的数据。我的意思是它应该是viewDidLoad还是viewWillAppear?
任何例子都会很棒。
答案 0 :(得分:0)
没有一个答案。但我的回答是...... viewWillAppear
拍摄几乎从未使用过的详细视图。所以也许你决定每次使用它时创建一个并在每次使用后销毁它。
采取可能经常使用的另一个细节视图。您决定创建一次并重新使用它。也许你甚至会在低内存警告时将其销毁,并在下次使用时重新创建它。在这种情况下,每次
时都不能依赖于viewDidLoad
使用viewWillAppear
使我的代码更加一致,并且当我意识到详细信息视图被调用的次数超出预期时,可以更轻松地进行更改。我应该重新使用它,而不是每次都创建它。
至于何时释放它们......这实际上取决于什么观点。它经常使用多久?简单存在需要多少内存?重新创建需要做多少工作?
答案 1 :(得分:0)
根据我的经验,实现详细视图控制器的最佳方法是:
MyDetailController * dc = [[MyDetailController alloc] initWithMyObject: anObject];
[self.navigationController pushViewController: dc animated: YES];
[dc release];
其中anObject是您要在详细视图控制器中显示的下载数据。
我假设您的列表控制器是您的应用程序的主要控制器,应该按如下方式实例化:
- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions {
_baseWindow = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]];
_listVC = [MyListController new];
[_baseWindow addSubview: _listVC.view];
[_baseWindow makeKeyAndVisible];
return YES;
}
并发布:
- (void) dealloc {
[_listVC release]; _listVC = nil;
[_baseWindow release]; _baseWindow = nil;
[super dealloc];
}
请记住-viewDidLoad是在-loadView之后调用的,当有人试图访问视图控制器的-view属性时会调用它。
因此,您可能希望在-viewDidLoad中准备视图,并在-viewWillAppear或-viewDidAppear中执行一些其他任务。请注意,-viewWillAppear(和类似的方法)被称为EVERY TIME,视图控制器的视图显示在屏幕上。也就是说,例如,如果您从详细信息vc中推送另一个VC然后弹出,则会再次调用-viewDidAppear。