Утечка CIIImage, когда я пытаюсь выполнить поворот за пределами экрана на 100 изображениях - PullRequest
0 голосов
/ 27 декабря 2011

Когда я использую следующий метод (под ARC), распределение памяти быстро увеличивается до более чем 125 мес.

Я реализовал это с помощью CGImage, но это довольно медленно.

imageArray содержит 125 UIImage размером 640x80.

-(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++;
}
}

Ответы [ 2 ]

1 голос
/ 27 декабря 2011

Проблема, вероятно, в том, что это похоже на

CIImage *outputImage = [ begin imageByApplyingTransform:transform];

выделяет изображение, которое не будет выпущено до тех пор, пока пул автоматического выпуска не будет слит, что происходит, когда ваша программа достигает цикла ожидания. Не попробовав свой код, могу ли я предложить вам обернуть внутренний цикл в

@autoreleasepool {
    ...
}

блок

0 голосов
/ 27 декабря 2011
UIImage *newImg = [UIImage imageWithCGImage:cgimg];

Не проблема, вы добавляете newImg в массив, поэтому он не должен быть уничтожен после выхода из метода. Проблема

CIImage *outputImage = [ begin imageByApplyingTransform:transform];

, но в любом случае, предложение использовать

@autoreleasepool {
...
}

это хорошо.

Также, если вам больше не нужны входные изображения, вы можете попробовать удалить их из массива после создания newImg.

...