viewDidLoad vs appDelegate方法

时间:2011-08-24 20:15:53

标签: objective-c

我坚持认为什么时候把东西放在一个viewController中,什么时候把它放在AppDelegate中,如果可以从AppDelegate引用viewController方法(我知道你可以但这并不意味着鼓励)。

真的,我不会感到困惑,如果不是所有这些多任务的东西似乎使我的概念复杂化。首先,如果有人知道如何处理多任务的良好,全面和易于阅读的概述,我很想知道。

这是交易:有些东西我需要我的应用程序加载时,无论是加载新鲜还是从后台加载。像执行网络可达性测试一样,根据从互联网收到的数据设置界面,以及这个或那个。

我的一个主要问题涉及viewcontroller的视图如何与背景状态交互。如果应用程序从后台恢复并且视图立即显示而没有加载,那么我认为它仍然在内存中并且我已经验证了没有使用基本NSLog调用viewDidLoad。 那么,可以说我的viewcontroller保留的任何和所有对象(如数据模型和所有子视图)仍然在内存中吗?如果没有,那么发现哪些对象需要的最佳实践是什么?重新加载,还有什么,等等?

2 个答案:

答案 0 :(得分:1)

解决此问题的一种方法是使用延迟加载的属性。在你的.h文件中:

@interface YourViewController : NSObject
@property (nonatomic, retain) NSArray *exampleObject;
@end

在你的.m文件中:

@implementation YourViewController

@synthesize exampleObject = _exampleObject;

- (NSArray *)exampleObject {
    // reload only if necessary
    if (!_exampleObject) {
        _exampleObject = [[NSArray alloc] init];
        // do whatever other setup you need to
    }
    return _exampleObject;
}

@end

答案 1 :(得分:1)

我认为即使在多任务环境中也可以安全地假设the standard memory management rules适用。这意味着您的控制器以及您在控制器中引用的任何内容在以下情况之前仍然有效:

  1. 您明确释放控制器/对象
  2. 您的应用已终止
  3. 似乎你的假设是系统会混淆你背后的物体,这(我希望)不会发生。这些方法存在于app委托中,以防您在发生这些特定事件时明确地执行任何操作。

    关于viewDidLoad问题,您可以实施viewDidUnload或检查isViewLoaded方法,以确保您的视图由于内存不足或其他原因而未卸载。有关详情,请参阅UIViewController documentation