2011-12-27 2 views
0

漏れますCGImageを使用していますが、かなり遅いです。CIIImage私は(ARC下)は、以下の方法を使用すると、メモリ割り当ては、私はそれを実装している125以上のMo</p> <p>まで急速に成長

imageArrayにはサイズが640x80の125 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

関連する問題