iOS iPad有1GB RAM为什么我的应用程序在使用30MB后被杀死

是不是可以编写一个使用200MB的应用程序?我的iPad有1GB,但我明白了

didReceiveMemoryWarning

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

所以我明白我应该在收到警告时释放内存,但我不想! (假设我的应用程序确实需要200MB才能运行).

如果我收到警告时会释放一些内存(多少钱?)那么我的应用程序会不会被杀死?然后我可以继续使用更多的内存吗?如果是这样,我可以创建一些“气球”记忆,这样我就可以在被警告时释放它,然后至少我的应用程序存活下来.这看起来很疯狂.

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

最佳答案 我最近有这个问题.它基本上归结为分配内存的速度.如果您尝试预先占用大量内存,那么iOS将终止您使用太多内存而不响应内存警告. iOS内存处理真的很荒谬.最糟糕的是,我的问题只是在我在应用程序商店发布应用程序后才出现.我花了很长时间来追踪问题是什么:(

我设法处理这个问题的方法是在启动时缓慢分配我需要的RAM(64MB)并在收到内存警告时暂停.我创建了自己的ViewController,它显示了一个动画启动画面,而我正在初始化内存使用情况.在viewDidLoad中,我执行以下操作(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并仍然启动.我假设触摸内存完全将其提交到我的应用程序,因此将内存归零以消除我遇到的内存警告和驱逐问题.

点赞