Pet*_*zes 2 iphone memory-management objective-c ios automatic-ref-counting
我正在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];
}
Run Code Online (Sandbox Code Playgroud)
我猜测存在内存问题,虽然因为我使用带有ARC的 iOS 5,所以我不应该进行任何手动内存管理.
可能是因为在记忆中存在太多东西吗?这是138张图片@~146 KB每张.这大概是20 MB,但我不认为仅此一项可能导致问题.
GDB退出时没有任何有用的输出,实际上根本没有输出.运行仪器显示,当暂停发生时,实际内存使用量仅为6.11 MB,77.4%CPU但175 MB虚拟内存.
我关心的是没有内存警告甚至实际崩溃的事实,线程只是暂停,无法自动恢复或终止,你必须从xcode中删除它.
它看起来很像你的应用程序被杀死,因为它需要太多的内存.实际上,20MB是我所经历的限制,这也与你通过Google搜索找到的内容相对应.
关于您没有收到任何内存警告的事实,这是因为您在紧密循环中将图像加载到内存中而不会将控制权返回到主循环.所以你没有机会收到消息didReceiveMemoryWarning.
解决方案非常简单,预加载大量图像,当您在旋转木马中移动时,预加载更多图像,同时还释放旧图像.实际上,您无需在内存中随时保存超过5张图像以保持球的运行.如果您担心几乎不必每次都加载图像,那么您可以增加该数量.
| 归档时间: |
|
| 查看次数: |
345 次 |
| 最近记录: |