- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个应用程序,它有几个不同的部分,所有这些部分都非常注重图像。它与我客户的网站相关,他们是“高设计”类型的服装。
该应用程序的一部分是从相机或库上传的图像,以及显示缩略图网格的表格 View 。相当可靠的是,当我处理 UIImagePickerControl 的相机版本时,我会因为内存不足而受到打击。如果我在应用程序的该部分徘徊一段时间,我偶尔会在调试器中出现“status:10 (SIGBUS)”崩溃,并且不会重复。
在内存不足警告时,应用程序该方面的 Root View Controller 会转到我的数据管理单例,遍历缓存数据数组,并删除最大的部分,即与每个条目关联的图像。因此:
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Low Memory Warning"
message:@"Cleaning out events data"
delegate:nil
cancelButtonTitle:@"All right then."
otherButtonTitles:nil];
[alert show];
[alert release];
NSInteger spaceSaved;
DataManager *data = [DataManager sharedDataManager];
for (Event *event in data.eventList) {
spaceSaved += [(NSData *)UIImagePNGRepresentation(event.image) length];
event.image = nil;
spaceSaved -= [(NSData *)UIImagePNGRepresentation(event.image) length];
}
NSString *titleString = [NSString stringWithFormat:@"Saved %d on event images", spaceSaved];
for (WondrMark *mark in data.wondrMarks) {
spaceSaved += [(NSData *)UIImagePNGRepresentation(mark.image) length];
mark.image = nil;
spaceSaved -= [(NSData *)UIImagePNGRepresentation(mark.image) length];
}
NSString *messageString = [NSString stringWithFormat:@"And total %d on event and mark images", spaceSaved];
NSLog(@"%@ - %@", titleString, messageString);
// Relinquish ownership any cached data, images, etc that aren't in use.
}
如您所见,我正在(糟糕的)尝试查看我正在释放的内存空间。我知道它并没有告诉我 UIImage 本身的实际内存占用量,但它至少给了我一些数字,所以我可以看到正在发生一些事情。 (对于我构建 NSLog 消息的笨拙方式感到抱歉——我本来打算触发另一个 UIAlertView,但意识到记录它会更有用。)
非常可靠的是,在应用程序的图像部分闲逛一段时间后,我将拉出相机界面并快速连续获得低内存 UIAlertView 三到四次。这是我上次看到它时的 NSLog 输出:
2010-05-27 08:55:02.659 EverWondr[7974:207] Saved 109591 on event images - And total 1419756 on event and mark images
wait_fences: failed to receive reply: 10004003
2010-05-27 08:55:08.759 EverWondr[7974:207] Saved 4 on event images - And total 392695 on event and mark images
2010-05-27 08:55:14.865 EverWondr[7974:207] Saved 4 on event images - And total 873419 on event and mark images
2010-05-27 08:55:14.969 EverWondr[7974:207] Saved 4 on event images - And total 4 on event and mark images
2010-05-27 08:55:15.064 EverWondr[7974:207] Saved 4 on event images - And total 4 on event and mark images
然后不久之后我们就得到了 SIGBUS 导出。情况就是这样。现在我的具体问题:
我看到这种情况发生的时间是当 UIPickerView 的相机光圈关闭时。我单击按钮拍照,它会执行“单击”动画,并且 Instruments 显示我的内存占用量从大约 10mb 到大约 25mb,并坐在那里直到图像传递到我的 UIViewController,其中使用量下降到 10 或又是11mb。如果我们在没有内存警告的情况下完成了这一切,我们就很成功,但很可能我们没有。我能做些什么来让它不那么贵吗?
其次,我启用了 NSZombies。我是否正确理解这实际上阻止了内存被释放?我是否让我的应用程序处于不公平的测试环境中?
第三,有什么方法可以以编程方式获取我的内存使用情况吗?或者至少是 UIImage 对象的用法?我已经浏览了文档,但没有看到任何相关内容。
最佳答案
这些函数让您了解总内存使用量和总可用内存。我的应用程序中碰巧有一个 1 秒计时器,它每秒记录已用和可用内存空间(如果其中任何一个更改 > 0.5mb),它可以帮助我更好地了解正在发生的情况:
#import "mach/mach.h"
vm_size_t usedMemory(void) {
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);
return (kerr == KERN_SUCCESS) ? info.resident_size : 0; // size in bytes
}
natural_t freeMemory(void) {
mach_port_t host_port = mach_host_self();
mach_msg_type_number_t host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
vm_size_t pagesize;
vm_statistics_data_t vm_stat;
host_page_size(host_port, &pagesize);
(void) host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size);
return vm_stat.free_count * pagesize;
}
EDIT1 - 函数 class_getInstanceSize为您提供对象实例的大小,但我从未尝试过,并且它可能不会取消引用 ivars 并汇总其用法。但也许它可以帮助你。
EDIT2 此函数为您提供 UIImage 的大小:
size_t sizeofUIImage(UIImage* image) {
return CGImageGetBytesPerRow(image.CGImage) * CGImageGetHeight(image.CGImage);
}
EDIT4 这是我的 1 秒计时器处理程序方法中的一些代码,它有助于在出现内存问题之前了解您的应用程序的运行情况。当然,可用内存会根据正在运行的后台任务(Safari、邮件等)而有所不同,而您对此没有太多控制权:
void logMemUsage(void) {
// compute memory usage and log if different by >= 100k
static long prevMemUsage = 0;
long curMemUsage = usedMemory();
long memUsageDiff = curMemUsage - prevMemUsage;
if (memUsageDiff > 100000 || memUsageDiff < -100000) {
prevMemUsage = curMemUsage;
NSLog(@"Memory used %7.1f (%+5.0f), free %7.1f kb",
curMemUsage/1000.0f, memUsageDiff/1000.0f, freeMemory()/1000.0f);
}
}
关于iphone - UIImagePicker 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2921560/
我在具有 2CPU 和 3.75GB 内存 (https://aws.amazon.com/ec2/instance-types/) 的 c3.large Amazon EC2 ubuntu 机器上运
我想通过用户空间中的mmap-ing并将地址发送到内核空间从用户空间写入VGA内存(视频内存,而不是缓冲区),我将使用pfn remap将这些mmap-ed地址映射到vga内存(我将通过 lspci
在 Mathematica 中,如果你想让一个函数记住它的值,它在语法上是很轻松的。例如,这是标准示例 - 斐波那契: fib[1] = 1 fib[2] = 1 fib[n_]:= fib[n] =
我读到动态内存是在运行时在堆上分配的,而静态内存是在编译时在堆栈上分配的,因为编译器知道在编译时必须分配多少内存。 考虑以下代码: int n; cin>>n; int a[n]; 如果仅在运行期间读
我是 Python 的新手,但我之前还不知道这一点。我在 for 循环中有一个基本程序,它从站点请求数据并将其保存到文本文件但是当我检查我的任务管理器时,我发现内存使用量只增加了?长时间运行时,这对我
我正在设计一组数学函数并在 CPU 和 GPU(使用 CUDA)版本中实现它们。 其中一些函数基于查找表。大多数表占用 4KB,其中一些占用更多。基于查找表的函数接受一个输入,选择查找表的一两个条目,
读入一个文件,内存被动态分配给一个字符串,文件内容将被放置在这里。这是在函数内部完成的,字符串作为 char **str 传递。 使用 gdb 我发现在行 **(str+i) = fgetc(aFil
我需要证实一个理论。我正在学习 JSP/Java。 在查看了一个现有的应用程序(我没有写)之后,我注意到一些我认为导致我们的性能问题的东西。或者至少是其中的一部分。 它是这样工作的: 1)用户打开搜索
n我想使用memoization缓存某些昂贵操作的结果,这样就不会一遍又一遍地计算它们。 两个memoise和 R.cache适合我的需要。但是,我发现缓存在调用之间并不可靠。 这是一个演示我看到的问
我目前正在分析一些 javascript shell 代码。这是该脚本中的一行: function having() { memory = memory; setTimeout("F0
我有一种情况,我想一次查询数据库,然后再将整个数据缓存在内存中。 我得到了内存中 Elasticsearch 的建议,我用谷歌搜索了它是什么,以及如何在自己的 spring boot 应用程序中实现它
我正在研究 Project Euler (http://projecteuler.net/problem=14) 的第 14 题。我正在尝试使用内存功能,以便将给定数字的序列长度保存为部分结果。我正在
所以,我一直在做 Java 内存/注意力游戏作业。我还没有达到我想要的程度,它只完成了一半,但我确实让 GUI 大部分工作了......直到我尝试向我的框架添加单选按钮。我认为问题可能是因为我将 JF
我一直在尝试使用 Flask-Cache 的 memoize 功能来仅返回 statusTS() 的缓存结果,除非在另一个请求中满足特定条件,然后删除缓存。 但它并没有被删除,并且 Jinja 模板仍
我对如何使用 & 运算符来减少内存感到非常困惑。 我可以回答下面的问题吗? clase C{ function B(&$a){ $this->a = &$a; $thi
在编写代码时,我遇到了一个有趣的问题。 我有一个 PersonPOJO,其 name 作为其 String 成员之一及其 getter 和 setter class PersonPOJO { priv
在此代码中 public class Base { int length, breadth, height; Base(int l, int b, int h) { l
Definition Structure padding is the process of aligning data members of the structure in accordance
在 JavaScript Ninja 的 secret 中,作者提出了以下方案,用于在没有闭包的情况下内存函数结果。他们通过利用函数是对象这一事实并在函数上定义一个属性来存储过去调用函数的结果来实现这
我正在尝试找出 map 消耗的 RAM 量。所以,我做了以下事情;- Map cr = crPair.collectAsMap(); // 200+ entries System.out.printl
我是一名优秀的程序员,十分优秀!