【问题标题】:Sending memory warning in applicationWillResignActive在 applicationWillResignActive 中发送内存警告
【发布时间】:2011-10-06 00:07:55
【问题描述】:

几天前,我在 SO 上发现了一个不错的 sn-p 来测试内存警告,只需每 10 秒左右发送一个 UIApplicationDidReceiveMemoryWarningNotification 通知。

我真的很喜欢这个想法,并采用它只在应用程序切换到后台时发送通知,因为它更容易清理一些内存,因为每个UIViewController 无论如何都会收听这个通知(并执行一些内存清洁,我也从中受益)。

由于我是一个懒惰的程序员,我想知道 Apple 是否允许这种技巧。 从技术上讲,这不是私有 API 的使用,我什至怀疑他们是否在测试期间发现了这样的东西,但是,我对此不是 100% 确定的。我正在使用的代码如下所示:

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Do some other stuff, unrelated to the question

    [[NSNotificationCenter defaultCenter] postNotificationName:UIApplicationDidReceiveMemoryWarningNotification object:application];
}

【问题讨论】:

    标签: objective-c ios memory appstore-approval


    【解决方案1】:

    我在我的 App iFerien Deluxe 中做了同样的事情,它顺利通过了审批流程。 就我个人而言,我不认为这对 Apple 来说是个问题。 但在我当前的应用程序中,我试图避免这种情况,因为它看起来有点 hacky,因为您最好在 applicationWillResignActive 中手动释放内存。

    【讨论】:

    • 我确实同意 hacky 部分,但我得出的结论是,我可以利用它来避免为每个视图控制器编写自定义代码(或为所有视图编写一个特殊的超类)控制器)。
    • 我会尽快给你赏金,大约在 22 小时内!
    【解决方案2】:

    这可能可能,但它的形式有点糟糕。

    您可以轻松编写自己的通知。只需打开项目的预编译头文件(通常在“Other Sources”或“Supporting Files”下,并确保它包含此#define。

    #ifdef __OBJC__
        #define MyApplicationDidReceiveMemoryWarning @"myMemoryWarningString"
    #endif
    

    PCH 有效地包含在您编译的每个文件中。在 applicationDidFInishLaunch:withOptions 中设置一个 NSTimer:

    [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(sendMemoryNotification) userInfo:nil repeats:YES];
    

    在 sendMemoryNotification 方法中,只发布通知

    -(void)sendMemoryNotification
    {
        [[NSNotificationCenter defaultCenter] postNotification:MyApplicationDidReceiveMemoryWarning];
    }
    

    任何持有重要数据的类都注册为 NSNotificationCenter 中键的观察者。

    【讨论】:

    • 我知道如何发送通知,这不是问题所在。问题是关于让 UIKit 框架为我完成所有工作的内置通知(包括一些我无法使用公共 API 完成的工作)
    • 我知道这不是问题;我只是想提供一个替代方案,因为每 10 秒自己发送一次系统通知听起来有点虚伪。
    • 啊,对不起,这是我从 SO 问题中得到想法的原始用例。我只想在我的应用进入后台模式时发送它以清理一些内存。
    • 您也可以随时注册 UIApplicationWillResignActiveNotification。
    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 2010-10-04
    • 2021-06-19
    • 2012-07-05
    • 2011-09-02
    • 1970-01-01
    相关资源
    最近更新 更多