2016-08-10 4 views
0

Недавно я использую PHAssets, чтобы заменить старые объекты в моем проекте. Однако, когда я использую свое приложение для масштабирования некоторых изображений, я обнаружил, что он обычно сбой. Я использую режим отладки, обнаружив, что это проблема с памятью. я использую ниже код, чтобы изменить картинуПамять об использовании drawInRect для изменения размера изображения

+(UIImage*)scaleRetangleToFitLen:(UIImage *)img sWidth:(float)wid sHeight:(float)hei{ 
    CGSize sb = img.size;; 
    if (img.size.height/img.size.width > hei/wid) { 
     sb = CGSizeMake(wid,wid*img.size.height/img.size.width); 
    }else{ 
     sb = CGSizeMake(img.size.width*hei/img.size.height,hei); 
    } 
    if (sb.width > img.size.width || sb.height > img.size.height) { 
     sb = img.size; 
    } 
    UIImage* scaledImage = nil; 
    UIGraphicsBeginImageContext(sb); 
    [img drawInRect:CGRectMake(0,0, sb.width, sb.height)]; 
    scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    img = nil; 
    return scaledImage; 
} 

память будет увеличиваться примерно 50М, когда код

[img drawInRect:CGRectMake(0,0, sb.width, sb.height)] 

работает, и это не будет выставиться бесплатно, даже думал, что метод закончен. ширина и высота 304 * 228, размер оригинального изображения примерно 3264 * 2448, возвращенное изображение 304 * 228, это означает, что реальное изображение, которое я хотел, было всего лишь размером изображения 304 * 228, однако оно принимает 50 + M memory. Есть ли способ освободить память, которую выполняет drawInRect: функция? (@autoreleasepool не работает ~)

ответ

0

При загрузке изображения iOS обычно не распаковывает его, пока он действительно не понадобится. Таким образом, изображение, которое вы передаете в свою функцию, скорее всего представляет собой изображение JPEG или PNG, которое iOS хранит в памяти в сжатом состоянии. В тот момент, когда вы его нарисуете, он будет сначала распакован, и, следовательно, память значительно возрастет. Я ожидал бы увеличения на 3264 x 2448 x 4 = 35MB (а не 50MB).

Чтобы избавиться от памяти снова, вы убедитесь, что вы отпустите все ссылки на изображение, которое вы передаете в свою функцию. Таким образом, проблема находится за пределами кода, который вы показываете в своем вопросе.

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

+0

Спасибо за ваш ответ. Код выглядит следующим образом: (Я добавляю свой код в комментарий ниже для лучшего чтения) – AFu

+0

верхний код в моем ответе, сейчас я пытаюсь использовать «UIImage * ti = [ pv.image.image copy]; " вместо «UIImage * ti = pv.image.image;», но это не работает; Кажется, что объект копирования и исходный объект связаны с одним и тем же изображением, если рисовать изображение, оно увеличивает память, однако исходный объект не настроен на свободный, поэтому память не будет выпущена, есть ли какое-либо решение для такая ситуация (объект UIImageView не нуждается в 35-мегабайтной версии, но я использую метод draw, беря его на 35M, после розыгрыша, как я могу установить версию 35M на маленькую) – AFu

+0

Кажется, я не должен использовать 3264 * 2448 размер изображения, я должен сначала использовать небольшую версию, чтобы ничья не увеличилась настолько ~~ – AFu