【问题标题】:Memory issue or something else?内存问题还是其他?
【发布时间】:2011-10-17 14:15:31
【问题描述】:

我正在我的 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,CPU 为 77.4%,但虚拟内存为 175 MB。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 此外,这 138 张图像作为未压缩位图在内存中占用的内存可能比磁盘上约 146 KB 的压缩文件大小要多得多。
    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 2016-02-24
    • 2015-10-12
    • 2022-06-21
    • 1970-01-01
    • 2011-11-20
    • 2019-08-10
    • 2021-08-26
    相关资源
    最近更新 更多