2014-02-27 30 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

相關問題