Ios 为什么我只分配了7 MB内存就收到内存警告?
我正在iPod touch设备上运行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,为什么会收到这些警告。这正常吗?我怎样才能避免这种情况 查看分配密度,我们可以看到下面的模式,它(对我来说)没有显示出推
- 左侧峰值(时间0.00)对应于分配的20 MB内存(介绍场景),尽管如此,不会给出任何内存警告
- 中央峰值(时间35.00)对应于分配的7 MB内存(游戏场景正在推送),并发出内存警告
[[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中运行的所有应用程序和进程共享的所有内存容量。因此,其他应用程序可能会占用大量内存,而您的应用程序也会收到内存警告。您将收到内存警告,直到内存不足 要了解应用程序内存的实际情况,您应该
查看这篇关于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)。仍然没有解决,所以任何人的进一步帮助都将非常感激。好吧,如果你有额外的帮助