2014-02-21 3 views
0

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

Проблема заключается в том, что каждый раз, когда я перезагружаю UICollectionView, изображения не освобождаются из памяти, и, похоже, они накапливаются до такой степени, что они сбой. Я не думаю, что это код UICollectionView, потому что если я запустил его с изображениями, которые не требуют границы, я не получу никаких проблем.

- (UIImage *)applyFrame:(UIImage *)image selectedFrame:(NSString *)selectedFrame { 

UIImage *frame; 

NSLog(@"Image Size For Frames: %f, %f",image.size.width,image.size.height); 

if(image.size.width == image.size.height){ 

    frame = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@-Square.png",selectedFrame] ofType:nil]]; 


} 

if(image.size.width > image.size.height){ 

    frame = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@.png",selectedFrame] ofType:nil]]; 


} 

if(image.size.width < image.size.height){ 


    frame = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@.png",selectedFrame] ofType:nil]]; 

    frame = [self rotateUIImage:frame clockwise:true]; 

} 

GPUImageAlphaBlendFilter *blendFilter = [[GPUImageAlphaBlendFilter alloc] init]; 
GPUImagePicture *imageToProcess = [[GPUImagePicture alloc] initWithImage:image]; 
GPUImagePicture *border = [[GPUImagePicture alloc] initWithImage:frame]; 

blendFilter.mix = 1.0f; 
[imageToProcess addTarget:blendFilter]; 
[border processImage]; 
[border addTarget:blendFilter]; 

[imageToProcess processImage]; 

return [blendFilter imageFromCurrentlyProcessedOutput]; 
} 

- (UIImage*)rotateUIImage:(UIImage*)sourceImage clockwise:(BOOL)clockwise { 
CGSize size = sourceImage.size; 
UIGraphicsBeginImageContext(CGSizeMake(size.height, size.width)); 
[[UIImage imageWithCGImage:[sourceImage CGImage] scale:1.0 orientation:clockwise ? UIImageOrientationRight : UIImageOrientationLeft] drawInRect:CGRectMake(0,0,size.height ,size.width)]; 
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return newImage; 
} 
+0

'В GPUImagePicture.m, прокрутите вниз до - (Недействительными) dealloc; метод и добавьте строку '[super dealloc];' в конце. «Помогает ли это? – Putz1103

+0

GPUImage - это ARC, поэтому Xcode не позволяет мне добавить эту строку. – ORStudios

+0

Это было с 2012 года, стоило сделать снимок ... – Putz1103

ответ

1

UIImage imageWithContentsOfFile: возвращает autorelease объект, который будет выпущен только тогда, когда приложение возвращается к текущему цикла выполнения. Итак, может случиться так, что вы довольно долго выполняете цикл приложений? В этом случае объекты автореферата могут накапливаться и увеличивать использование кучи.
Если да, то вы могли бы попытаться вставить в тело ответственного петлевой autorelease блок:

@autoreleasepool { 
...your statements 
} 
Смежные вопросы