Ошибка памяти с селектором выполнения - iPhone - PullRequest
0 голосов
/ 10 сентября 2010

У меня проблема, и я не знаю, как ее решить. это то, что я пытаюсь сделать: пользователь выбирает изображение из своего альбома на своем iphone. пока изображение будет сохранено в папке приложения, должна появиться таблица действий с индикатором активности до завершения процесса сохранения. ниже вы можете увидеть, как я пытался это сделать, но я думаю, что мой код вызывает проблему с памятью (EXC_BAD_ACCESS), но я не могу это исправить.

Когда я отлаживал, я обнаруживал, что оба метода, перечисленных ниже, будут вызываться в цикле, вот что меня больше всего смущает.

Заранее спасибо за помощь.

1007 * Sean *

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage* img = [info objectForKey:UIImagePickerControllerOriginalImage];
    img = [self rotateImage:img byOrientationFlag:img.imageOrientation];

    NSMutableArray *args = [[NSMutableArray alloc] init];

    activityLoadImage = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(-17.5, -11, 35, 35)];
    activityLoadImage.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    activityLoadImage.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleTopMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);


    actionSheetLoadImage = [[UIActionSheet alloc] initWithTitle:@""
                                                   delegate:self
                                          cancelButtonTitle:nil
                                     destructiveButtonTitle:nil
                                          otherButtonTitles:nil];
    actionSheetLoadImage.actionSheetStyle = UIBarStyleBlackOpaque;

    [actionSheetLoadImage setMessage:NSLocalizedString(@"_LoadImage", @"loading image")];
    [actionSheetLoadImage addSubview:activityLoadImage];
    [actionSheetLoadImage showInView:self.view];
    [actionSheetLoadImage setBounds:CGRectMake(0,-105,320,720)];

    [args insertObject:picker atIndex:0];
    [args insertObject:img atIndex:1];
    [args insertObject:[info objectForKey:UIImagePickerControllerOriginalImage] atIndex:2];

    [activityLoadImage performSelectorOnMainThread:@selector(startAnimating) withObject:nil waitUntilDone:NO];
    [self performSelector:@selector(saveImage:) withObject:args afterDelay:0.1];
    [args release];
}

- (void)saveImage:(NSMutableArray *)arguments
{   
    UIImagePickerController *picker = [[arguments objectAtIndex:0] retain];
    UIImage *img = [[arguments objectAtIndex:1] retain];
    UIImage *orgImg = [[arguments objectAtIndex:2] retain];

    // writes the image to specific location with the given file name
    NSData *imageData = [self getImageData:img];
    [imageData writeToFile:[self getImagePath] atomically:YES];

    // writes the small image to specific location with the given file name
    imageData = [self getSmallImageData:img];
    [imageData writeToFile:[self getSmallImagePath] atomically:YES];

    // sets UIImage for the UIImageView
    [self setViewInfo];
    lblNoImage.hidden = TRUE;

    [[picker parentViewController] dismissModalViewControllerAnimated:YES];
    [self.tableView reloadData];

    [activityLoadImage performSelectorOnMainThread:@selector(stopAnimating) withObject:nil wait    UntilDone:NO];
    [actionSheetLoadImage dismissWithClickedButtonIndex:0 animated:YES];
    [activityLoadImage release];
    [actionSheetLoadImage release];
}

1 Ответ

0 голосов
/ 10 сентября 2010

Вы передаете аргументы в saveImage, а затем освобождаете его.Поскольку метод ожидает 0,1 секунды, прежде чем выполнить к этому времени, аргументы уже были освобождены.Постарайтесь не выпускать аргументы, чтобы посмотреть, решит ли это вашу проблему, а затем подумайте о лучшем способе управления памятью, возможно, оставьте ее как свойство класса.

...