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