2

UIImagePickerController を使用して複数の写真を撮ろうとすると、アプリがクラッシュします。そのため、最初に写真を撮るときはすべて問題なく、2 回目はエラー メッセージなしでアプリがクラッシュします。私はこれを初めて取得します:

2013-01-11 16:36:24.178 DoodleStash[26778:907] Received memory warning.

写真を撮るために使用しているコードは次のとおりです。

- (IBAction)takePhoto:(id)sender {

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes = [NSArray arrayWithObjects:(NSString *) kUTTypeImage, nil];

    [self presentViewController:imagePicker animated:YES completion:nil];
    self.isNewDoodle = TRUE;
}}

そして、これが私が写真を保存するために使用するものです

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

NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

[self dismissViewControllerAnimated:YES completion:nil];


if ([mediaType isEqualToString:(NSString *) kUTTypeImage]) {
    self.doodleImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    // Check to make sure the image is new
    if (self.isNewDoodle == TRUE) {
        UIImageWriteToSavedPhotosAlbum(self.doodleImage, self, @selector(image:finishedSavingWithError:contextInfo:), nil);
    }

    [self performSegueWithIdentifier:@"confirmUploadSegue" sender:self];
}}

これについて何か助けていただければ幸いです。完全なコードはこちらhttps://gist.github.com/4515007

4

2 に答える 2

0

まず、カメラを開くには、以下の行を試してください。

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

imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;

imagePicker.delegate = self;

[self presentViewController:imagePicker animated:YES completion:nil];

カメラのクリック後に画像を保存するためにこれを試してください:

              **UPDATED ANSWER**  

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
        {
           UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
        if (self.isNewDoodle == TRUE) 
       {
        UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:finishedSavingWithError:contextInfo:), nil);}
    [self performSegueWithIdentifier:@"confirmUploadSegue" sender:self];
    }
   [self dismissViewControllerAnimated:YES completion:nil];
      }

- (void)image:(NSString*)videoPath didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo
{
    if (error)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Photo Saving Failed"  delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles: nil, nil];
        [alert show];
    }
    else
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Photo Saved" message:@"Saved To Photo Album"  delegate:self cancelButtonTitle:@"Ok" otherButtonTitles: nil];
        [alert show];
    }
}

これを試して確認してください。

于 2013-01-12T08:19:47.643 に答える
0

これはクラッシュではなく、メモリの警告です (アプリはメモリ不足の状態でシステムによって強制終了されます)。すべてのコードを見ないと、アプリがメモリを使いすぎている理由を判断するのは困難です。プロファイラーを使用して調査する必要があります。

与えられたコードでは、イメージを書き込んだ後にのみセグエを実行し ( で)、不要になった後にimage:finishedSavingWithError:contextInfo:ゼロ化することで (おそらく で)メモリ使用量を減らすことができます。後者は、コントローラーを再利用する場合に特に重要です(2 回目にコントローラーを使用しても、以前に取得したイメージへの参照を保持しているため、メモリ使用量が実質的に 2 倍になります)。doodleImageprepareForSegue:sender:TakePhoto

于 2013-01-13T09:19:38.953 に答える