4

例如,是否可以编写一个使用 200MB 的应用程序?我的 iPad 有 1GB,但我得到了

didReceiveMemoryWarning

使用 20 或 30MB 后不久我的应用程序被杀死。(我是前台应用程序,所以我真的不明白为什么我必须得到这个警告,为什么操作系统不关闭后台应用程序,但无论如何)。我在 didReceiveMemoryWarning 中没有采取任何行动(只是记录它并调用 super),这就是我被杀的原因吗?还是有其他可能的原因?

所以我知道当我收到警告时我应该释放内存,但我不想!(假设我的应用确实需要 200MB 才能运行)。

如果我在收到警告时确实释放了一些内存(多少?),那么我的应用程序不会被杀死吗?然后我可以继续使用更多的内存吗?如果是这样,我可以创建一些“气球”内存,以便在收到警告时释放它,然后至少我的应用程序可以存活。不过,这似乎很疯狂。

或者说基本上不可能有一个使用超过几十 MB 的 iPAD 应用程序?

4

2 回答 2

2

我最近遇到了这个问题。它基本上归结为您分配内存的速度。如果您尝试预先获取大量内存,那么 iOS 会因您使用过多内存而不响应内存警告而终止您的操作。iOS 内存处理真的很荒谬。最糟糕的是,我的问题只是在我在应用商店发布应用之后才出现的。我花了很长时间才找到问题所在:(

我设法处理这个问题的方法是在启动时缓慢分配我需要的 RAM (64MB),并在我收到内存警告时推迟。我创建了自己的 ViewController,它在初始化内存使用时显示动画启动屏幕 在 vi​​ewDidLoad 中我执行以下操作(Meg 是一个简单的内联函数,乘以 1024* 1024):

AllocBlockSize = Meg( 2 );
mAllocBlock     = (char*)malloc( mAllocBlockSize );
//[mpProgressLabel  setText: @"Initialising Memory: 1MB"];
mpInitTimer     = [NSTimer scheduledTimerWithTimeInterval: 0.5f         target: self    selector: @selector( AllocMemory )  userInfo: nil repeats: YES];

在我的 AllocMemory 选择器中,我这样做:

- (void) AllocMemory
{
    if ( self.view == nil )
        return;


    if ( mMemoryWarningCounter == 0 )
    {
        if ( mAllocBlockSize < Meg( 64 ) )
        {
            mAllocBlockSize *= 2;
            mAllocBlock = (char*)realloc( mAllocBlock, mAllocBlockSize );
            ZeroMemory( mAllocBlock, mAllocBlockSize );

            if ( mAllocBlockSize == Meg( 64 ) )
            {
                mMemoryWarningCounter = 8;
            }
        }
        else
        {
            free( mAllocBlock );
            // Initialise main app here.
        }
    }
    else
    {
        mMemoryWarningCounter--;
    }
}

为了处理内存警告,我执行以下操作:

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    mMemoryWarningCounter   += 4;
}

还要注意 ZeroMemory 步骤。当我在这里没有这个时,我会分配 64MB 并且仍然可以启动。我认为触摸内存会将其完全提交给我的应用程序,因此需要将内存归零以消除我遇到的内存警告和驱逐问题。

于 2013-05-01T14:15:43.860 回答
0

有什么不对劲。在 6-8 的大多数 iOS 版本下,任何应用程序都可以在任何设备上使用大约 1/3-1/2 的总物理内存,而不会被 jetslammed(杀死)

我可以编写一个简单的应用程序,在 1gb 设备上立即占用 400mb,并且它不会被杀死——除非 iOS 不能足够快地终止其他服务。

IOS 8 比 6 或 7 更宽容,因为许多启动守护程序现在有一个 jetslammed 优先级标志,该标志决定了哪些东西被杀死 - 以及一个内存限制,所以如果一个 LD 超过那个高水位标记,它就会被杀死。IOS 应该让任何应用程序继续使用内存,直到所有较低优先级的 jetslammed 服务都被杀死。LD 还有另一种设置,当内存处于压力之下时会终止它们 - 无论 JS 优先级如何。

一旦剩下的是比用户应用程序具有更高优先级的服务,那就是当喷射/杀死或应该在它被猛击之前得到内存警告

在 iPad 6 (air 2) 上编程要容易得多。2GB 内存。启动后免费 300-400MB,iOS 将回退到使用 700MB,允许 1.3GB 用于应用程序......而且我敢打赌 iPhone 7 和 mini 4s 将有 2GB。如果且仅当用户支付普通 PS3 游戏的价格(20-80 美元)时,这将让我们看到 iOS 的 Play Station 3 或更好的游戏。大多数人会抱怨,但大多数人在这些免费付费(游戏)应用程序上花费更多,iAps 为 4.99 美元-129.99 美元 - 荒谬(苹果应该将 iAps 限制为 29.99)

10% 规则的日子已经一去不复返了(您的应用程序应该使用不超过 10% 的系统内存)

看看更多的硬核、主要的 iOS 游戏......它们在 1gb 设备上使用 300-400MB,而不会在 512mb 设备上运行。

因此,如果您因 30MB 而被杀死,那确实是不对的。

于 2014-12-13T04:56:22.900 回答