0

UIStoryboardPopoverSegue を介して呼び出されるビューコントローラーがあり、内部には imagePickerController を呼び出すボタンがあります。最初の呼び出しでは問題ありませんが、2 回目はクラッシュします。

コードは、UIStoryboardPopoverSegue を介していない場合に使用しても問題ありません。

   -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *image=[info objectForKey:UIImagePickerControllerOriginalImage];
    UIImageWriteToSavedPhotosAlbum (image, nil, nil , nil);
    [self dismissViewControllerAnimated:YES completion:nil];

}
-(IBAction)takephoto:(id)sender
{
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        self.imagePicker.delegate=self;
        self.imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;

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

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (!self.imagePicker)
    {
        self.imagePicker = [[UIImagePickerController alloc] init];
    }
}

NSZobmbie を有効にして、追跡に役立つログを表示できるようにしました。

* -[UIImagePickerController isKindOfClass:]: 割り当て解除されたインスタンス 0x1eb3b700 に送信されたメッセージ

4

1 に答える 1

1

UIImagePickerController が解放され、後でアクセスしようとするとクラッシュします。

これを修正するには、UIImagePickerController を所有インスタンスの強く参照されるプロパティにします。

@property (strong, nonatomic) UIImagePickerController *imagePicker;

一度初期化します:

if (!self.imagePicker) self.imagePicker = [[UIImagePickerController alloc] init];

そして使用:

[self.imagePicker doStuff]

アクセスのために。

それで解決するはずです。

編集

if ([[segue identifier]isEqualToString:@"tcwindshield"]) { 
   self.ips = [segue destinationViewController]; 
   self.ips.delegate = self
   self.ips.strStatValue=@"WindShield"; 
}
于 2013-07-26T14:55:58.827 に答える