内存问题或其他什么?

时间:2011-08-01 16:12:59

标签: iphone objective-c ios memory-management automatic-ref-counting

我正在iPad上运行一个应用程序,将图像加载到旋转木马中。总共有138张图片。如果我将该数字减少到100,应用程序加载正常。然而,在138,应用程序暂停,而不是崩溃。

正在访问viewDidLoad和第一个for语句,如断点所示。问题出在第二个for声明中。

    // loading images into the queue

loadImagesOperationQueue = [[NSOperationQueue alloc] init];
NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:14];

for (int i = 0; i < 137; i++) {
    [tmpArray addObject:[NSString stringWithFormat:@"cover_%d.jpg", i]];
}

for (int i = 0; i < 137; i++) {
    int index = arc4random() % [tmpArray count];
    NSString *imageName = [tmpArray objectAtIndex:index];
    [tmpArray removeObjectAtIndex:index];
    [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i];
}

我猜测存在内存问题,但由于我使用带有ARC的iOS 5,我不应该进行任何手动内存管理。

可能是因为还有很多内容要保留在内存中吗?这是138张图片@~146 KB每张。这大概是20 MB,但我不认为仅此一项可能导致问题。

GDB退出时没有任何有用的输出,实际上根本没有输出。运行仪器显示,当暂停发生时,实际内存使用量仅为6.11 MB,77.4%CPU但175 MB虚拟内存。

我关心的是没有内存警告甚至实际崩溃的事实,线程只是暂停,无法自动恢复或终止,你必须从xcode中删除它。

1 个答案:

答案 0 :(得分:5)

看起来很像应用程序被杀死,因为它需要太多内存。实际上,20MB是我所经历的限制,这也与你通过Google搜索找到的内容相对应。

关于您没有收到任何内存警告的事实,这是因为您在紧急循环中将图像加载到内存中而不会将控制返回到主循环。因此,您没有机会收到消息didReceiveMemoryWarning

解决方案非常简单,预加载大量图像,当您在旋转木马中移动时,预加载更多图像,同时释放旧图像。实际上,您无需在内存中随时保存超过5张图像以保持球的运行。如果您担心几乎不必每次都加载图像,那么您可以增加该数字。