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

时间:2013-05-01 13:57:37

标签: ios memory ram

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

didReceiveMemoryWarning

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

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

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

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

2 个答案:

答案 0 :(得分:2)

我最近遇到了这个问题。它基本上归结为分配内存的速度。如果您尝试预先占用大量内存,那么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并仍然启动。我假设触摸内存完全将其提交给我的应用程序,因此必须将内存归零以消除我遇到的内存警告和驱逐问题。

答案 1 :(得分:0)

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

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

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

一旦剩下的是比用户应用程序具有更高优先级的服务,那就是jetslamms / kill或者在它被抨击之前得到内存警告

在iPad 6(air 2)上进行编程非常简单。 2gb ram。启动后300-400MB免费,iOS将恢复使用700MB,允许1.3GB的应用程序....我打赌iPhone 7和mini 4s将有2GB。这将让我们看到玩家站3,或更好的游戏,iOS IF和只有用户将支付正常的PS3游戏(20-80美元)的价格。大多数人都会抱怨,但大多数花在这些免费支付(播放)应用程序上花费更多4.99 $ -129.99 $ iAps - 荒谬(Apple应该将iAps限制在29.99)

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

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

所以,如果你因30MB被杀,那么事情真的是不对的。