泄漏CGImageMergeXMPPropsWhithLegacyProps

时间:2012-07-19 21:22:10

标签: ios memory-leaks cgimage alassetslibrary

我正在跟踪我的iOS应用程序上的内存泄漏,我有一个奇怪的泄漏,使我的应用程序崩溃... 负责的框架是:CGImageMergeXMPPropsWhithLegacyProps。 在某些时候,我的应用程序收到了内存警告...

我正在从ALAsset创建UIImage,如下所示:

    ALAsset *asset = [assetsArray objectAtIndex:index];
    UIImage *image = [UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]];

你知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

希望这有帮助。 我也使用ALAsset,我遇到了内存警告。我仍在为我的应用程序搜索我的解决方案......崩溃可能是因为iOS因为内存警告而取消了您的视图或对象。因此,可能防止内存警告很重要。保持峰值内存低至30MB。我遇到了ipad2的50MB的内存警告,并没有从iphone4获得它。无论如何,越低越好。    首先,您可以测量内存 通过使用仪器或以下代码。在记录代码中更容易测量内存。 1.注册计时器以反复报告内存使用情况,您可以通过这种方式查看峰值内存使用情况。   另一方面,我不知道为什么这个函数会逐渐增加内存。 2.“iPhone编程大书呆子牧场指南”一书中称iOS可能有24MB的图形内存    “过度使用图形内存通常是应用程序收到内存不足警告的原因.Apple建议您不要使用超过24 MB的图形内存。对于图像, iPhone屏幕的大小,使用的内存量超过半兆字节。每个UIView,图像,核心动画层以及可以在屏幕上显示的任何其他内容都会消耗一些分配的24 MB。 (Apple并未建议NSStrings等其他类型数据的最大值。)“    因此,请查看图形内存使用情况。

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(reportMem) userInfo:nil repeats:TRUE];
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];


-(void) reportMem{
[self report_memory1];
}

-(void) report_memory1 {
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);
natural_t freem =[self get_free_memory];
if( kerr == KERN_SUCCESS ) {
    NSLog(@"Memory in use %f %f(free)", info.resident_size/1000000.0,(float)freem/1000000.0);
} else {
    NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}




}


-(natural_t) get_free_memory {
mach_port_t host_port;
mach_msg_type_number_t host_size;
vm_size_t pagesize;
host_port = mach_host_self();
host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t);
host_page_size(host_port, &pagesize);
vm_statistics_data_t vm_stat;

if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) {
    NSLog(@"Failed to fetch vm statistics");
    return 0;
}

/* Stats in bytes */
natural_t mem_free = vm_stat.free_count * pagesize;
return mem_free;
}