Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么我只分配了7 MB内存就收到内存警告?_Ios_Memory Management_Memory Warning - Fatal编程技术网

Ios 为什么我只分配了7 MB内存就收到内存警告?

Ios 为什么我只分配了7 MB内存就收到内存警告?,ios,memory-management,memory-warning,Ios,Memory Management,Memory Warning,我正在iPod touch设备上运行iOS应用程序,即使总分配峰值仅为7 MB,我也会收到内存警告,如下所示(这在按下游戏场景时发生): 我觉得奇怪的是: 左侧峰值(时间0.00)对应于分配的20 MB内存(介绍场景),尽管如此,不会给出任何内存警告 中央峰值(时间35.00)对应于分配的7 MB内存(游戏场景正在推送),并发出内存警告 我不明白,如果总内存只有7MB,为什么会收到这些警告。这正常吗?我怎样才能避免这种情况 查看分配密度,我们可以看到下面的模式,它(对我来说)没有显示出推

我正在iPod touch设备上运行iOS应用程序,即使总分配峰值仅为7 MB,我也会收到内存警告,如下所示(这在按下游戏场景时发生):

我觉得奇怪的是:

  • 左侧峰值(时间0.00)对应于分配的20 MB内存(介绍场景),尽管如此,不会给出任何内存警告

  • 中央峰值(时间35.00)对应于分配的7 MB内存(游戏场景正在推送),并发出内存警告

我不明白,如果总内存只有7MB,为什么会收到这些警告。这正常吗?我怎样才能避免这种情况

查看分配密度,我们可以看到下面的模式,它(对我来说)没有显示出推送介绍场景的时刻(0.00)和推送游戏场景的时刻(35.00)之间的很大差异由于密度峰值相似,我假设内存警告是由于我无法发现的其他原因造成的

编辑:

我一直在遵循使用“活动监视器”的建议,但不幸的是,我的应用程序在加载仅分配了30 MB内存的游戏场景时崩溃。这是活动监视器报告

查看报告,我可以看到实际内存使用总量约为105MB。鉴于此,应参考RAM内存,鉴于我的型号应具有足够的RAM,这不应导致应用程序崩溃或内存泄漏问题

我运行泄漏监视器,它在我的应用程序上没有显示任何泄漏。我还杀死了所有其他的应用程序

然而,在分析报告时,我发现与我的应用程序关联的虚拟内存值达到了惊人的167MB。这正常吗?这个值是什么意思?这可能是坠机的原因吗?如何检测代码中的哪些区域对此负责

我的iPod是第四代型号,容量为6.4 GB(内存),可用内存只有290 MB。我不确定这是否会以某种方式影响虚拟内存的性能

编辑2:我还详细介绍了SpringBoard,它的虚拟内存使用率是180MB。这正常吗?我发现一些似乎表明SpringBoard负责自动释放对象(它应该是管理屏幕和主页botton的过程,但我不确定它是否也与内存管理有关)。这是正确的吗

另一张纸条。我正在使用ARC。但是,我不确定这与问题有多大关系,因为没有明显的内存泄漏,XCode应该将添加release/dealloc/retain调用的代码转换为已编译的二进制代码

编辑3:如前所述,我正在使用ARC和Cocos2d(2.0)。我一直在玩活动监视器。我发现,如果我删除GameCenter身份验证机制,那么活动监视器运行正常(新疑问:是否有其他人有类似问题?GameCenter身份验证视图是否保留在某个位置?)。然而,我注意到,每次我在游戏场景之前的各种场景中来回导航(初始场景->角色选择->行星选择->角色选择->行星选择->等等->角色选择…)时,实际内存使用量增加。过了一会儿,我开始收到内存警告,应用程序被iOS杀死。现在的问题是:

->我是否以正确的方式替换场景?我从不同的场景中调用以下内容:

[[CCDirector sharedDirector] replaceScene: [MainMenuScene scene]];
我将Cocos2d 2.0作为静态库
,替换场景的代码如下:

-(void) replaceScene: (CCScene*) scene
{
    NSAssert( scene != nil, @"Argument must be non-nil");

    NSUInteger index = [scenesStack_ count];

    sendCleanupToScene_ = YES;
    [scenesStack_ replaceObjectAtIndex:index-1 withObject:scene];
    nextScene_ = scene; // nextScene_ is a weak ref
}
不知怎么的,这场戏是不是没有得到妥善的处理。我验证了正在调用cleanup方法,但是我还对CCLayer dealloc方法添加了一个CCLOG调用,并重建了静态库。结果是dealloc方法似乎没有被调用

这正常吗D


我发现其他人有。我想知道这是否与我真的需要花一些时间研究这一点有关,除非在编辑3中,任何人都可以告诉我我做错了什么:-)

通过iOS中运行的所有应用程序和进程共享的所有内存容量。因此,其他应用程序可能会占用大量内存,而您的应用程序也会收到内存警告。您将收到内存警告,直到内存不足

要了解应用程序内存的实际情况,您应该

  • 使用漏洞配置你的应用程序(ARC不能保证你没有漏洞,即自我捕获问题)

  • 使用heapshot分析(此处简要介绍)


  • 查看这篇关于iOS中内存和虚拟内存的帖子:

    我通过在控制台中添加进程有效内存使用率的打印解决了这个问题。通过这种方式,我可以精确测量应用程序进程使用的实际内存。使用仪器被证明是不精确的,因为实际使用的内存与仪器上显示的内存不匹配

    此代码可用于获取有效内存使用率:

    -(vm_size_t)report_memory
    {    
        struct task_basic_info info;
        mach_msg_type_number_t size = sizeof(info);
        kern_return_t kerr = task_info(mach_task_self(),
                                       TASK_BASIC_INFO,
                                       (task_info_t)&info,
                                       &size);
        if( kerr == KERN_SUCCESS ) {
        } else {
            NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
        }
        return info.resident_size;
    }
    

    在后台图形内存中运行的任何其他应用程序(例如,用于大图像或纹理的应用程序)将不会显示在分配工具中。改为使用活动监视器。尝试推送并再次返回查看几次。检查当您尝试按下并弹出视图时,是否确实收到内存警告?您使用的是哪种iPod Touch型号?@mm24为活动监视器选择“所有进程”。这不应该导致你的应用程序崩溃。另外,如果你正在做opengl的东西,请使用opengl工具。谢谢你的回答。它确实帮助我思考ARC和自我捕捉问题。我正在调查此事,并在问题中就我的问题补充了一些见解(见编辑3)。仍然没有解决,所以任何人的进一步帮助都将非常感激。好吧,如果你有额外的帮助