2012-03-10 7 views
14

私は、HD写真を操作するアプリケーションで作業しています。 AVCaptureSessionで写真を撮影して停止し、その写真にエフェクトを適用します。AVCaptureSessionはメモリ警告を出し、理由なしでクラッシュします

私がCRAZYになるのは、すべてがうまく動作することです。楽器は、私が正しく使用しているすべてのメモリを解放していると教えてくれます。それは本当に高いはい、時々100メガバイトになります。しかし、それはすぐに下がります。

次に、キャプチャセッションを再開し、メモリ警告が表示されます。その理由はまったくありません;解放された場合に使用したすべてのメモリ...次に、次回キャプチャセッションを再開すると、アプリケーションがクラッシュします。メッセージなし、ログなし、何もありません。

私はこれを解決する方法がわかりません、私はどこを探すべきかわかりません...誰かが私を少し助けてくれるなら、私はとてもうれしいでしょう!

ありがとうございます!

+0

いくつかのコードが役に立ちます。 –

答えて

22

私は同じ不満を抱きました。私は、AV Foundationを使用してカメラを発表していたプロジェクトでARCを使用していました。表示コントローラを数回プレゼンテーションしてポップした後、私のアプリケーションはメモリ不足の警告を受け、その後クラッシュします。インストゥルメンツもあまり役に立たなかった。

カメラクラスでARCを使用していても、deallocメソッドを実装できます(deallocではsuperを呼び出さないでください)。

- (void)dealloc { 
    AVCaptureInput* input = [session.inputs objectAtIndex:0]; 
    [session removeInput:input]; 
    AVCaptureVideoDataOutput* output = [session.outputs objectAtIndex:0]; 
    [session removeOutput:output]; 
    [session stopRunning]; 
} 

これは、AVCaptureSessionを停止し、入力または出力がまだ生きていないことを保証します。

+2

@bryndodayleあなたは私の人生を救った、ありがとう! –

+0

最初に入力と出力が削除されるのはなぜですか?なぜすべての入力と出力を削除しないのですか? –

13

私は、この行が主な問題

[self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

ただ、割り当てを解除しながら、スーパー層からpreviewlayerを削除し、何のメモリの問題がないです発見した同じ問題に遭遇しています。私の割り当て解除関数は次のとおりです。

-(void)deallocSession 
{ 
[captureVideoPreviewLayer removeFromSuperlayer]; 
for(AVCaptureInput *input1 in session.inputs) { 
    [session removeInput:input1]; 
} 

for(AVCaptureOutput *output1 in session.outputs) { 
    [session removeOutput:output1]; 
} 
[session stopRunning]; 
session=nil; 
outputSettings=nil; 
device=nil; 
input=nil; 
captureVideoPreviewLayer=nil; 
stillImageOutput=nil; 
self.vImagePreview=nil; 

} 

他のビューをポップして押す前にこの関数を呼び出しました。それは私の問題を解決した。

関連する問題