2014-02-27 27 views
0

我的iOS应用程序崩溃,它使用CoreGraphics来处理图像。iOS应用程序崩溃,频繁图像绘制到上下文

一段时间后,我已经与这段代码上来:

UIImage * image = info[UIImagePickerControllerOriginalImage]; // fromcamera 

    for (int i = 0; ; ++i) 
    { 
    NSLog(@"----- Step %d ---------", i); 

    UIGraphicsBeginImageContext(image.size); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); 

    UIImage * image1 = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 
    } 

它崩溃在我的iPhone 5 24次循环后(无法连接到设备直接 - 已使用的XCode 4.6哪些不能调试iOS 7)。

任何想法为什么?

+0

您可以附上崩溃报告吗?你可能用完了内存,Zaph是对的。 –

+0

正如我之前写的 - 无法使用XCode 4.6附加到iOS 7设备上。 – Werolik

回答

1

在最低限度添加@autoreleasepool到环路的临时释放:

for (int i = 0; ; ++i) { 
    @autoreleasepool { 
     NSLog(@"----- Step %d ---------", i); 

     UIGraphicsBeginImageContext(image.size); 
     CGContextRef context = UIGraphicsGetCurrentContext(); 

     CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), image.CGImage); 

     UIImage * image1 = UIGraphicsGetImageFromCurrentImageContext(); 

     UIGraphicsEndImageContext(); 
    } 
} 

而且要创建在每个循环迭代新image1,但它没有被使用。

+0

立即尝试@autorelease池(由我自己获取;)。这段代码没有做任何事情,只是演示了崩溃,所以,yep,image1未被使用。 – Werolik

+0

是的,autorelease池帮助。你能解释一下,为什么会发生这种情况?我认为,使用ARC不应该导致这种问题 - 正如您所说,image1未被使用,那么为什么我的内存不足?我的想法是我更快地分配内存,而不是释放内存。我在这里纠正? – Werolik

+0

ARC和Objective-C运行时使用一个自动释放池。放入池中的物品稍后会回收,通常在运行循环中回收。在一个没有发生的紧密循环中。 @autoreleasepool作用域可以更快地释放池中的项目。即使在Apple框架中,事情也是自动发布的,即有多少对象可以安全地返回到调用方法。好的,这是一个简单的解释,请详细了解autorelease池。 – zaph

相关问题