2011-12-27 59 views
0

執行脫離屏幕的旋轉當我使用下面的方法(ARC下)的存儲器分配的增長迅速達到超過125的Mo.CIIImage泄漏當我嘗試在多達100個圖像

我已經實現它使用CGImage,但速度很慢。

imageArray包含125個大小爲640x80的UIImage。

-(void)rotateAndTransform{ 
int j=0; 
context = [CIContext contextWithOptions:nil]; 
for(UIImage* item in imageArray) 
{ 
CGImageRef intermed =[item CGImage]; 
CIImage *begin = [CIImage imageWithCGImage:intermed]; 
CGAffineTransform transform = CGAffineTransformMakeRotation(-M_PI/2); 
CIImage *outputImage = [ begin imageByApplyingTransform:transform]; 
CGImageRef cgimg = [context createCGImage:outputImage fromRect:[outputImage extent]]; 
UIImage *newImg = [UIImage imageWithCGImage:cgimg]; 
CGImageRelease(cgimg); 
[self.imagesFromExtract addObject:newImg]; 
j++; 
} 
} 

回答

1

這個問題可能是,這就像

CIImage *outputImage = [ begin imageByApplyingTransform:transform]; 

分配將不會被釋放,直到自動釋放池排出的圖像,當你的程序達到空閒循環恰好。如果沒有嘗試過你的代碼,我可能會建議你將內環包裹在一個

@autoreleasepool { 
    ... 
} 

塊?

+1

它沒有解決問題,當我使用內部循環@autoreleasepool。 –

0
UIImage *newImg = [UIImage imageWithCGImage:cgimg]; 

是沒有問題的,要添加到newImg陣列,因此它不應該從方法退出後銷燬。 問題是

CIImage *outputImage = [ begin imageByApplyingTransform:transform]; 

,但無論如何,建議使用

@autoreleasepool { 
... 
} 

好。另外,如果您不再需要輸入圖像,則可以在創建newImg後嘗試將它們從陣列中移除。

+0

你說得對。我在那裏複製/粘貼太快了。我編輯了我的答案。 – Krumelur