2010-08-11 1 views
2

Я хочу, чтобы всегда использовать один и тот же экземпляр UIImagePickerController во всем моем приложении, так как я не хочу выделять и уничтожать мои сборщик каждый раз, когда пользователь делает снимок. Приложение использует сборщик и UIImageView с именем pictureA, чтобы показать изображение choossen из альбома iPhone или снятое с камерой.Правильное использование UIImagePickerController для съемки с камерой или выбора их из библиотеки iphone

На старте я allock мой взгляд выбора контроллера, как это:

imagePickerController = [[UIImagePickerController alloc] init]; 
    imagePickerController.delegate = self; 
    [self addSubview:imagePickerController.view]; 

Когда я беру картину из палитры и поместите его в моей UIImageView:

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ 

    // newImage is a UIImage do not try to use a UIImageView  
    UIImage *newImage = [info objectForKey:@"UIImagePickerControllerEditedImage"]; 

     [pictureA removeFromSuperview]; 

     CGRect myImageRect = CGRectMake(30.0f, 38.0f, 125.0f, 125.0f); 
     pictureA = [[UIImageView alloc] initWithFrame:myImageRect]; 
     pictureA.contentMode= UIViewContentModeScaleAspectFit; 
     [pictureA setImage:newImage]; 
     pictureA.opaque = YES; 
     [self addSubview:pictureA]; 


     [newImage release]; 

     [picker dismissModalViewControllerAnimated:YES]; 
     [picker.view setHidden:YES]; 

    } 

Когда выбирает изображение из iphone-х библиотека:

- (void) chooseImageFromLibrary { 
    [imagePickerController.view setHidden:NO]; 
     imagePickerController.allowsEditing = YES; 
    [imagePickerController viewWillAppear:YES]; 
    [imagePickerController viewDidAppear:YES]; 
} 

Отмена:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{ 
    [[picker parentViewController] dismissModalViewControllerAnimated:YES]; 
    [picker.view setHidden:YES]; 
} 

- (void) takePicture { 


    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    { 
     [(MainScene*)[melonGame actualScene] setCameraDissabled:YES]; 
     return; 
    } 


    [imagePickerController.view setHidden:NO]; 

    imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; 
    imagePickerController.allowsEditing = YES; 

    [imagePickerController takePicture]; 


    [imagePickerController viewWillAppear:YES]; 
    [imagePickerController viewDidAppear:YES]; 
} 

Приложение будет работать должным образом, когда я сделаю первый снимок, но когда я попытаюсь сделать другое изображение или выбрать другое изображение из своей библиотеки, он выглядит точно так же, как в последний раз, когда я выбрал картинку (с изображением во всех экран и неактивное меню для выбора и отмены внизу). Мое приложение работает только правильно, если я удаляю контроллер из своего представления и выделяю его каждый раз, когда пользователь делает снимок. Есть ли способ «очистить» или «перезапустить» сборщик, не выпуская его и не удаляя из моего представления?

Я также не уверен, могу ли я указать экземпляр UIImageView (pictureA), где я храню изображение, полученное с помощью imagePickerController, и изменять его каждый раз, когда пользователь делает снимок или выбирает один из альбома, я подозреваю, что это некорректно, чтобы уничтожить его и перераспределить его каждый раз, когда пользователь делает снимок. Любые предложения?, Что я делаю неправильно в отношении управления памятью или использования UIImagePickerController и UIImageView?

спасибо!

ответ

0

Я не думаю, что UIImagePickerControllers предназначены для повторного использования. В любом случае, они используют TON памяти (особенно камеру), поэтому вы не хотите держать их вокруг дольше, чем вам нужно. Итак, да, вы должны освободить подборщик изображений, когда закончите с ним, и создайте новый, когда хотите добавить другое изображение.

Вы должны, вероятно, представит свой imagepicker модально:

[self presentModalViewController:imagePickerController animated:YES]; 

Вам не нужно, чтобы освободить ваше мнение pictureA изображение каждый раз, когда вы хотите изменить образ. Просто измените свойство изображения.

pictureA.image = newImage; 

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

if (!pictureA) { 
    pictureA = [[UIImageView alloc] initWithFrame:aFrame]; 
} 

pictureA.image = ... 

Имейте в виду, что вызов Alloc должен соответствующий вызов либо освободить или autorelease. Когда вы выделили «pictureA» выше, его счет сохранения стал 1. называя «[self addSubview: pictureA]»; увеличил его количество до 2. Когда вы назовете «[pictureA removeFromSuperview]»; в следующий раз количество удержания уменьшилось до 1, и вы создали новое изображение. Поэтому каждый раз, когда вызывается imagePickerController: didFinishPickingMediaWithInfo: вы будете утечки памяти.Вместо этого do

[pictureA removeFromSuperview]; 
[pictureA release]; 

, когда вы удаляете его из супервизора. Или, еще лучше, сделать снимок свойство класса:

@property (nonatomic, retain) UIImageView *pictureA; 

, который будет выпускать старую ImageView при назначении нового. Просто убедитесь, что отпустить, когда вы назначаете его :)

self.pictureA = [[[UIImageView alloc] init] autorelease]; 

или

UIImageView *imageView = [[UIImageView alloc] init]; 
self.pictureA = imageView; 
[imageView release]; 

Я бы лично придерживаться стиля autorelease, потому что вы всегда будете в состоянии сказать сразу, если вы правильное распределение/деаллокация.

Кроме того, вы всегда можете дважды проверить управление памятью с помощью продукта> Анализ в Xcode 4.

Смежные вопросы