如何从AppDelegate访问对象而不影响内存管理?

时间:2014-03-17 23:15:19

标签: ios objective-c cocoa-touch cocoa

我有几个视图控制器对象,每个对象都可以从UITextField获取一些用户输入,将输入保存到可变数组并显示在UITableView中。

当用户按下主页按钮时,我也希望将这些可变数组保存在文件中,所以我在AppDelegate.m中找到了以下代码:

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

似乎这种方法非常适合在用户按下主页按钮时保存用户数据,但我的问题是如何访问在不同视图控制器中声明的这些可变数组以便将它们保存到文件中?我当然可以在AppDelegate中创建指针并使它们指向每个视图控制器对象,但我知道当程序内存不足时可以卸载视图;因此,如果我在AppDelegate中创建这些指针,那么当内存不足时(因为强引用),这些视图对象永远不会被卸载。我该怎么办?谢谢!

4 个答案:

答案 0 :(得分:1)

您需要获得MVC(模型/视图/控制器)宗教信仰。不要将模型(NSMutableArrays)与控制器(UIViewController)混合使用。如果将所有模型数据保存在单独的类中,则无需担心视图控制器是否存在。此外,保持程序逻辑清洁变得非常容易。将所有保存/加载内容放入模型类中。您可以让您的模型类监听UIApplicationWillResignActiveNotification并在收到它们时保存。

不幸的是,Apple的模板倾向于推动人们在应用代表或视图控制器中投入大量资金。只有真正应用全球的东西才能进入app delegate。只有控制器代码(在模型和视图之间进行调解)才能进入视图控制器。

答案 1 :(得分:1)

用户界面的一般设计模式是模型视图控制器。数据存储(“模型”)保存在与视图控制器不同的对象中。

例如,您可以创建一个存储所有应用程序数据的对象,在AppDelegate didFinishLaunchingWithOptions:方法中对其进行实例化,并将引用存储在AppDelegate的属性中。然后,每个视图控制器都可以使用[UIApplication sharedApplication].delegate.myData来检索引用。

答案 2 :(得分:0)

在其他视图控制器中执行此操作

id myid = [[UIApplication sharedApplication] delegate];

请更换" id"使用AppDelegate类的名称(通常是AppDeletegate)。

您当然必须在实现文件的顶部#import AppDelegate。

答案 3 :(得分:0)

我建议听听UIApplicationWillResignActiveNotification。

同样在iOS6及更高版本中,当内存不足时,视图不会被卸载

  
      
  • (void)viewWillUnload讨论在iOS 5及更早版本中,当发生内存不足的情况并且当前视图控制器的视图时   如果不需要,系统可以选择从中删除这些视图   记忆。在释放实际视图之前调用此方法   您可以在取消分配视图之前执行任何清理。对于   例如,您可以使用此方法删除视图作为观察者   通知或记录视图的状态,以便它可以   重新加载视图时重新建立。
  •   
     

在iOS 6及更高版本中,不再清除对视图的引用   必要。因此,任何其他与这些视图相关的清理,例如   将观察者移除后,也没有必要。