2013-10-16 21 views
9

私はUIImagePickerControllerを使用してユーザーが写真を撮ることができるアプリを持っています。ios7/iphone 4sでUIImagePickerがクラッシュする

私は、単一のビューコントローラのアプリケーションで最も簡単なシーケンスにテストケースを減らしました。ここに私のコードです。

// 
// CTViewController.h 
// Camera Test 
// 

#import <UIKit/UIKit.h> 

@interface CTViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate> 

@property (nonatomic, retain) UIImagePickerController *cameraController; 

- (IBAction)takePicture:(id)sender; 

@end 

次のようにコードの本体は次のとおりです。

// 
// CTViewController.m 
// Camera Test 

#import "CTViewController.h" 

.... 

- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __func__); 

    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)takePicture:(id)sender 
{ 
    self.cameraController = [[UIImagePickerController alloc] init]; 

    self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera; 
    self.cameraController.allowsEditing = YES; 
    self.cameraController.delegate = self; 
    [self presentViewController:self.cameraController animated:YES completion:nil]; 
} 

「takePictureは」私は画面の中央に押すことができるボタンにフックアップされています。

ios 6ではすべてが完璧に動作しますが、ios 7ではviewcontrollerが提示されるとメモリ警告のカスケードが発生します。したがって:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates. 
Received memory warning. 
-[CTViewController didReceiveMemoryWarning] 

.... <here I take a picture, which I do nothing with> 

Received memory warning. 
-[CTViewController didReceiveMemoryWarning] 
Received memory warning. 
-[CTViewController didReceiveMemoryWarning] 

.... <I get a cascade of these warnings> 

アプリは、私は、IOS 6.1 SDKでビルドしますが、ios7上で実行した場合のXcode 5.同じ問題を使用して7.0 SDKが発生し、IOSを使用して構築されています。 ios 6.1 sdkでビルドし、ios 6.1.3で実行すると、メッセージは表示されず、問題は発生しません。

私の完全なアプリケーションは、ios 7で時間の50%がクラッシュします。私はメモリの警告(これは主にメモリからの多くのものを投げてメモリに応答し、プロファイリングはこれを確認しますが、まだ警告のカスケードを取得しますすなわち、メモリが解放された後も継続する)。

フロントカメラを使用している場合、ギャラリーから選択するか、iPad 3を使用するとメッセージは表示されません。したがって、メモリ問題は、リアカメラが使用されているときにUIImagePickerControllerのサイズに関連付けられていると考えられます。私は完全にstackoverflowのを模索しており、特に、この記事を見てきました

からUIImagePickerController error: Snapshotting a view that has not been rendered results in an empty snapshot in iOS 7

私はすべてが提案試してみましたが、私の簡単なテストアプリは説明のほとんどを排除します。

どのような考えですか?私はiPhone 4Sのサポートを断念すべきですか?私はまだiPhone 5で問題を確認していませんが、私はすぐにこの質問を更新します。

+0

iOS7搭載のiPhone 4sで写真を確認して受け入れた後も、カメラのクラッシュと同じ問題が発生しています。 –

+4

これは奇妙なので私は答えとして提供していません。私は全く同じ問題を抱えていましたが、iPhone 5ではそうでした。スタックオーバーフローを注ぎ、4時間かけて尋ねる。最後に、私は自分のiPhone 5を再起動しました。それ以上のメモリ警告はありません。彼らは戻ってくるかもしれませんが、問題のアプリで写真を撮ってから2時間後にはまだメモリの警告はありません。奇妙な! – JimVision

+0

これはそれを "修正"するようです。何が... ... –

答えて

3

:-)

私の代わりにローカルオブジェクトを持って、イメージピッカーのためのプロパティを使用していないあなたをお勧めします。 IOS7でもうまく動作する私のコードを参照してください。

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
{ 
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; 
    imagePicker.delegate = self; 
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    imagePicker.showsCameraControls = YES; 

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

この提案を展開できますか?私はカスタムオーバーレイを持つアプリケーションを持っており、オーバーレイコントローラ内にimagePickerの参照を渡すので、オーバーレイ内でtakePhotoを呼び出すことができます。IBAction: ** [self。cameraPickerRef takePicture] ** –

+0

また、カメラデバイスを切り替えると、カスタム黒サブビューをself.imagePicker.viewに追加して、トランジションが少し上手くなります。このメソッドでは、サブビューを追加してカメラデバイスを設定するために、imagePickerへの参照が必要です。 –

+0

あなたの写真を撮るとすぐに割り当てが解除されますが、あなたが強い参照を必要とする場合は、それはより複雑です。 –