Управление памятью iPhone с помощью UIImage - PullRequest
1 голос
/ 24 апреля 2009
- (void)imagePickerController:(UIImagePickerController *)picker 
        didFinishPickingImage:(UIImage *)image 
                  editingInfo:(NSDictionary *)editingInfo {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [self.pickerTrigger setImage:image];
    [self.button setTitle:@" " forState:UIControlStateNormal];
    [self.button setTitle:@" " forState:UIControlStateSelected];
    [self.button setTitle:@" " forState:UIControlStateHighlighted];

    CGSize oldSize = [image size];
    CGFloat width = oldSize.width;
    CGFloat height = oldSize.height;
    CGSize targetSize = CGSizeMake(320.0, 400.0);
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(oldSize, targetSize) == NO)
    {
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor > heightFactor)
            scaleFactor = widthFactor;
        else
            scaleFactor = heightFactor;
        scaledWidth = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        if (widthFactor > heightFactor)
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        else if (widthFactor < heightFactor)
            thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
    }

    UIGraphicsBeginImageContext(targetSize);

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width = scaledWidth;
    thumbnailRect.size.height = scaledHeight;
    [image drawInRect:thumbnailRect];

    self.selectedImage = UIGraphicsGetImageFromCurrentImageContext();

    NSLog([NSString stringWithFormat:@"After getting from DB %d", [selectedImage retainCount]]);
    UIGraphicsEndImageContext();
    [pool release];
    [picker dismissModalViewControllerAnimated:YES];
}

переменная selectedImage была объявлена ​​как сохраняемое свойство в файле интерфейса. Как вы можете догадаться, я сделаю эскиз к изображению, чтобы сохранить его в selectedImage. затем я снова использую его в другой функции и освобождаю в функции dealloc.

Приборы показывают, что объект освобождается, но память продолжает увеличиваться? Значит ли это, что освобождение объектов не обязательно освобождает память?

С UIImages я сталкиваюсь слишком часто? Есть догадки?

Я добавил [selectedImage release] к (void) функции dealloc, которая вызывается, значение count становится равным нулю, а объект освобождается. Но часть памяти выделяется (я полагаю, что при использовании UIGraphicsGetImageFromCurrentImageContext (); я думаю), которая не освобождается Я добавляю 4-5 изображений, память достигает колоссальных 117 МБ в симуляторе, а затем уменьшается до 48 МБ в симуляторе. Но приложение вылетает на iPhone. Должен ли я использовать какой-то другой подход при создании изображения?

Ответы [ 2 ]

0 голосов
/ 24 апреля 2009

Приборы показывают, что объект освобождается, но память продолжает увеличиваться? Значит ли это, что освобождение объектов не обязательно освобождает память?

Когда вы отпускаете объект, он уменьшает его счетчик ссылок на 1, он освобождается из памяти формы только тогда, когда этот счетчик достигает нуля.

Ваш UIImage не будет выпущен, если его использует кто-то другой, это может быть ваш код или представление, созданное вами в Интерфейсном конструкторе.

Возможно, вы звоните, сохраняйте слишком основное время, поэтому счетчик ссылок никогда не достигнет нуля.

Кроме того, помните, что в начале каждого цикла событий на iPhone создается пул автоматического выпуска. Вы всегда можете добавить к этому свой объект и автоматически очистить его.

0 голосов
/ 24 апреля 2009

Если вы выбрали selectedImage, объявленный как «сохраняемое свойство», вы должны отправить ему сообщение, чтобы освободить его.

Это потому, что изображение сохраняется внутри неявного вызова для установщика: self.selectedImage = XXX . Вы не можете видеть это, потому что это в коде, который компилятор создает для установщика свойства.

...