1

カメラで画像をキャプチャしています。次に、キャプチャした画像を表示する次のコントローラーに移動します。イメージ画面のキャプチャに戻り、このサイクルが 10 ~ 15 回続きます。この後、画像をキャプチャしようとすると、「メモリ不足の警告」が表示されてアプリがクラッシュします。コードは次のとおりです。

- (IBAction) takePhoto:(id) sender
{
    /*
    tempControl *intermediate=[[tempControl alloc] initWithNibName:@"tempControl" bundle:nil];
    [self.navigationController pushViewController:intermediate animated:YES];
    [intermediate release];
     */
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
        imagePickerController= [[UIImagePickerController alloc] init];
        [imagePickerController setMediaTypes:[NSArray arrayWithObjects:(NSString *)kUTTypeImage, nil]];
        imagePickerController.delegate = self;
        imagePickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;

        [self presentModalViewController:imagePickerController animated:YES];
    }
    else{
        UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Camera Alert" message:@"Device Lacks Camera" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
            [alert release];
            alert = nil;
    }
}

- (void)imagePickerController:(UIImagePickerController *)picker 
        didFinishPickingImage:(UIImage *)image
                  editingInfo:(NSDictionary *)editingInfo{

    [picker dismissModalViewControllerAnimated:NO];
    [picker release];
    picker =nil;
    /*
    cropReciept *recieptToCrop=[[cropReciept alloc] initWithNibName:@"cropReciept" bundle:nil];
    [recieptToCrop setReciept:image];
    [self.navigationController pushViewController:recieptToCrop animated:YES];
    [recieptToCrop release];
     */
    OCRDemoViewController *recieptToCrop=[[OCRDemoViewController alloc] initWithNibName:@"CropTestViewController" bundle:nil];
    [recieptToCrop setImageToCrop:image];
    if ([self.selectedTicketType isEqualToString:@"MAXI QuickPick"]) {
        recieptToCrop.selectedValueOfTicket=50;
        recieptToCrop.drawNumber=self.selectedDrawNumber;
    }
    else if ([self.selectedTicketType isEqualToString:@"JUMBO QuickPick"]) {
        recieptToCrop.selectedValueOfTicket=36;
        recieptToCrop.drawNumber=self.selectedDrawNumber;
    }
    else if ([self.selectedTicketType isEqualToString:@"MEGA QuickPick"]) {
        recieptToCrop.selectedValueOfTicket=24;
        recieptToCrop.drawNumber=self.selectedDrawNumber;
    }
    else if ([self.selectedTicketType isEqualToString:@"REGULAR QuickPick"]) {
        recieptToCrop.selectedValueOfTicket=12;
        recieptToCrop.drawNumber=self.selectedDrawNumber;
    }
    else if ([self.selectedTicketType isEqualToString:@"SUPER QuickPick"]) {
        recieptToCrop.selectedValueOfTicket=18;
        recieptToCrop.drawNumber=self.selectedDrawNumber;
    }

    [self.navigationController pushViewController:recieptToCrop animated:YES];
    [recieptToCrop release];
    recieptToCrop=nil;
}
4

2 に答える 2

1

デリゲートコールバックでピッカーを解放するのではなく、ブロックをディスパッチして次の実行ループで実行します(performSelector after:0も使用できます)。

また、Instruments ObjectAllocとLeaksを使用して、割り当てが解除されていないものを確認します。

于 2012-09-20T11:32:15.107 に答える
0

画像のサイズを変更してから使用する必要があります。カメラからクリックされた画像は約です。2 MB 以上。カメラからキャプチャした画像をリサイズしてから使用してみてください。あなたがする必要があります: -

- (void)imagePickerController:(UIImagePickerController *)picker 
        didFinishPickingImage:(UIImage *)image
                  editingInfo:(NSDictionary *)editingInfo{
UIGraphicsBeginImageContext(size);//640*920 or what ever you think appropriate 
    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
    UIImage *finalImage = UIGraphicsGetImageFromCurrentImageContext();    
    UIGraphicsEndImageContext();
    [picker dismissModalViewControllerAnimated:NO];
    [picker release];
    picker =nil;
}
And now use finalImage instead of image
于 2012-09-20T12:17:53.857 に答える