две утечки памяти с помощью UIImagePickerController и UIPopoverController - PullRequest
1 голос
/ 17 декабря 2010

нубский вопрос здесь.

У меня есть следующий код:

- (IBAction)selectExistingPicture 
{  
 if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]) 
 { 
  UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
  imagePicker.delegate = self;
  imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

  UIPopoverController *popVC = [[UIPopoverController alloc] initWithContentViewController: imagePicker];
  popVC.delegate = self; 
  [popVC setPopoverContentSize:CGSizeMake(320, 100)];
  [popVC presentPopoverFromRect:CGRectMake(39, 356, 320, 100) inView:self.view permittedArrowDirections:1 animated:NO];
 }
 else 
 {
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error accessing photo library"
              message:@"Device does not support a photo library" delegate:nil
             cancelButtonTitle:@"Cancel" otherButtonTitles:nil]; 
  [alert show]; 
  [alert release];
 }
}

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

спасибо!

1 Ответ

3 голосов
/ 17 декабря 2010

Вы не выпускаете imagePicker или popVC в любом месте, поэтому ваша утечка. Вы можете добавить авто-релиз или выпустить где-то там для тех.

Выберите один из следующих методов:

/*  this is the method I would suggest  */
UIPopoverController *popVC = [[[UIPopoverController alloc] initWithContentViewController: imagePicker] autorelease];  

UIImagePickerController *imagePicker = [[[UIImagePickerController alloc] init] autorelease];    

или

/*  with these, you could potentially over-release somewhere, so be careful  */

[popVC release];

[imagePicker release];

Также обратите внимание, как вы использовали [alert release];. Та же концепция.

...