2

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

for正在到达viewDidLoad 和第一个语句,如断点所示。问题在于第二个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,CPU 为 77.4%,但虚拟内存为 175 MB。

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

4

1 回答 1

5

看起来你的应用程序被杀死了,因为它占用了太多内存。确实,20MB 是我经历过的限制,这也与您通过谷歌搜索可以找到的内容相对应。

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

解决方案非常简单,预加载一些图像,当您在轮播中移动时,预加载更多图像,同时释放较旧的图像。实际上,您在任何时候都不需要在内存中存储超过 5 个图像来保持球运行。如果您担心不必几乎每次都加载图像,那么您可以增加该数量。

于 2011-08-01T16:16:35.607 回答