当应用程序进入后台模式时释放图形

Posted

技术标签:

【中文标题】当应用程序进入后台模式时释放图形【英文标题】:Release graphics when app entered to background mode 【发布时间】:2012-02-27 15:36:53 【问题描述】:

在 Apple 文档中,您可以发现 Apple 建议在您的应用进入后台模式时释放图像等大量数据。 如何从UIViews 和其他数据中释放图像? 如何以正确的方式从所有viewController 发布来自UIViews 的图像? 应用收到applicationWillResignActive消息时如何恢复数据? 如果有人有一个很好的例子或链接,请展示它。

【问题讨论】:

为什么有这么多反对票?好的,这是一个模糊的问题,但实际上是一个很好的问题。很高兴看到一个好的答案(即对初学者有用)。 【参考方案1】:

添加到应用程序委托 2 方法

- (void)applicationDidEnterBackground:(UIApplication *)application

    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_APP_BACKGROUND object:nil];


- (void)applicationWillEnterForeground:(UIApplication *)application

    [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_APP_BACKGROUND object:nil];

使用方法制作 BaseViewController:

- (id)init

    self = [super init];
    if (self) 
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appWillForeground) name:NOTIFICATION_APP_FOREGROUND object:nil];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appDidBackground) name:NOTIFICATION_APP_BACKGROUND object:nil];
    

    return self;



- (void)appDidBackground 


- (void)appWillForeground 


- (void)dealloc 
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];

从 BaseViewController 子类化所有视图控制器。在方法 appDidBackground 你应该释放不需要的数据,在 appWillForeground - 恢复它

【讨论】:

1.有人告诉我,如果使用[UIImage imagenamed:@"image.png"] - 这不会从内存中释放图像。 2.如何保存你的数据然后恢复。使用 NSUserDefaults?如果您使用 coreData 很容易。但是例如如何保存 nsarray,我可以将它保存到 nsuserdefaults 或 plist 文件。什么是正确的方法? 1. [UIImage imageNamed] 缓存所有图像。它可能会在内存警告时被释放。 2. 要保存大量数据,您应该使用 coredata,对于少量数据 - NSUserDefaults 是个好方法。如果你想保存一个包含一些自定义对象的数组(在 NSUserDefaults 中),你应该为其中的每个自定义类实现 NSCoding 协议。 如何释放使用 loadView 添加的 UIView。有人说需要使用viewDidUnload,但是app进入后台模式这个方法不会调用。

以上是关于当应用程序进入后台模式时释放图形的主要内容,如果未能解决你的问题,请参考以下文章

相机打开时如何释放相机?

当应用程序进入后台时 UIWindow 变为 NULL

当应用程序进入后台时开始播放音频文件

当应用程序快速进入后台时,如何使用 AVLayer 继续将视频作为 VideoView 层播放

在下次运行之前以后台模式关闭应用程序[重复]

当应用程序进入后台时停止后台服务