在iPad设备上处理低内存启动情况

在iPad设备上处理低内存启动情况,ipad,ios,memory,crash,ios-4.2,Ipad,Ios,Memory,Crash,Ios 4.2,在iPad设备上运行的游戏应用程序存在很多内存不足的问题。因此,我正在为自己的游戏考虑以下解决方案:在应用程序启动之前,我分配所需的空间,并在启动时立即释放它 这似乎工作得很好,让我在应用程序运行时在内存分配问题上更加稳定。你觉得怎么样?这是一个好方法吗 e、 g: { 大小\u t大小=30*MB; NSLog(@“释放%u字节”,大小); 分配的大小=0; while(已分配

在iPad设备上运行的游戏应用程序存在很多内存不足的问题。因此,我正在为自己的游戏考虑以下解决方案:在应用程序启动之前,我分配所需的空间,并在启动时立即释放它

这似乎工作得很好,让我在应用程序运行时在内存分配问题上更加稳定。你觉得怎么样?这是一个好方法吗

e、 g:

{
大小\u t大小=30*MB;
NSLog(@“释放%u字节”,大小);
分配的大小=0;
while(已分配<大小和块中心<最大块){
常量大小\u t块大小=256*KB;//256K块
blocks[blocksCenter]=malloc(blockSize);
if(块[BlocksCenter]){
bzero(块[BlocksCenter],块大小);
}
否则{
NSLog(@“idx%d处的警告空块”,BlocksCenter);
}
BlocksCenter++;
分配+=块大小;
} 
对于(int i=blocksconter-1;i>=0;i--){
if(块[i]){
自由(块[i]);
}
}
区块中心=0;
}

这是非常糟糕的做法。因为强制执行内存不足警告(例如导致退出iPod应用程序或停止其他正在运行的后台应用程序,如skype或您的导航软件)不是一种良好的用户体验


我会更仔细地观察你的内存消耗情况,或者在每次启动应用程序时用你的胳膊肘。这在iOS上不是好公民。

欢迎使用SO!花一分钟的时间看看“我不应该在这里问什么问题”下面的,特别是第三个要点。既然你的问题似乎已经解决了,那就有点主观了。谢谢你的指点!下次发帖时,我会记住这一点!但关于我的帖子,我并不认为它是一个解决方案,希望人们告诉我该怎么做,因为上面的代码是一种变通方法。但如果我只释放我的应用程序所需的空间(无论如何都应该存在),我不认为这是一种技术。我知道这是一种解决办法,但我对AudioToolBox(在单独的线程中运行)有问题,因为iOS没有足够快地释放内存。首先它崩溃,malloc返回一个0大小的块,然后出现didReceiveMemoryWarning消息:-/那就做你该做的。但这看起来像是一个黑客。也许考虑一下你在这里描述的记忆问题的根源。也许在苹果的bug reporter上提交一个关于你的内存分配问题的bug。我考虑了你所说的,并重新考虑了我的解决方案。我花了整整一天的时间,但正如你所说,这真是一次恶作剧。方法是在应用程序启动时预加载所有纹理。现在这个问题不再发生了,作为一个好的iOS公民,我的应用程序的内存占用非常小听起来好多了。在本地缓存中预加载纹理并在出现内存不足警告时清空该缓存没有什么错。这比什么都不分配内存更有意义。我很乐意帮忙。
{
    size_t size = 30*MB;

    NSLog(@"free up %u bytes", size);

    size_t allocated = 0;

    while(allocated < size && blocksCounter < MAX_BLOCKS) {
        const size_t blockSize = 256*KB;    // 256K blocks

        blocks[blocksCounter] = malloc(blockSize);

        if(blocks[blocksCounter]) {
            bzero(blocks[blocksCounter], blockSize);
        }
        else {
            NSLog(@"warning empty block at idx %d", blocksCounter);
        }

        blocksCounter++;
        allocated += blockSize;
    } 

    for(int i=blocksCounter-1; i>=0; i--) {
        if(blocks[i]) {
            free(blocks[i]);
        }
    }

    blocksCounter = 0;
}