2011-10-17 17 views
7

これは、iOS4と5のカメラ操作でAppleから提供されたAVCamサンプルコードの周りに見いだされた質問ではありません。私の問題の症状は、約5-10枚の写真を撮った後にAVCamViewControllerを起動すると、私のアプリがクラッシュするということでした。AVCamメモリ不足警告

私はメモリリークプロファイラでアプリケーションを実行しましたが、明らかなリークはありませんでしたが、Activity Monitorで検査したところ、カメラが起動されるたびにmediaserverdと呼ばれるものが17Mb増加し、複数のメモリ不足警告がクラッシュしました。

+0

ありがとう!その答えを答えに分割して、それを受け入れることができます:[自分の質問に答えるエチケット](http://meta.stackexchange.com/questions/17845/etiquette-for-answering-your-own-question)と[あなたが既に答えを見つけた投稿と回答の質問](http://meta.stackexchange.com/questions/2706/posting-and-answering-questions-you-have-already-found-the-answer-to) – sehe

+0

私はプレミアムユーザーではないので、24時間以内に私自身の質問に答えることはできませんでした...それを取り乱す時間がありませんでした(または私が記録したいものを忘れる)...私は今それをやることができるかどうかを見ます。 –

答えて

4

Appleが保持サイクルを固定する、2013年10月17日にサンプルコードを修正しました。この問題は、initに定義されているブロック内で、selfの不適切な使用が原因です。

はここでリークが発生しAVCaptureManagerでサイクルを保持固定改訂説明

です。 - アプリにAVCamコードを適用した場合は、AVCaptureManager.minitメソッドで修正を適用する必要があります。これらの修正がなければ、アプリがフォアグラウンドになっている間にカメラが常に稼働したままで、AVCaptureManagerのインスタンスが漏れている可能性があります。


しかし、それらが導入修正は手動の場合で動作カウントを保持します。プロジェクトでARCを使用している場合、release/retainコールや他の明白なことを除いて、weakSelfのストレージ修飾子を__blockから__weakに変更する必要があります。

__weak AVCamCaptureManager *weakSelf = self; 

実際には、__blockの意味がARCで変更されました。 MRCでは、変数が弱く参照されました.ARCでは変数が参照されず、__weakをこの目的に使用する必要があります。このトピックに関する

詳しい情報はここで見つけることができます:How do I avoid capturing self in blocks when implementing an API?

最後のリビジョンから新しいinit実装を使用して__weak代わりの__blockを使用して、最終的にはdealloc方法が適切と呼ばれる原因となりました。 https://github.com/Gabro/AVCam

特長:


最後に、古いレガシーコードを持ち歩くことを憎む人々のために、ここでAVCamプロジェクトの近代化バージョンだ

  • メモリリークが
  • 無料ARCを使用しています
  • 現代的なObjective-Cの構文
  • マイナーUI iOS 7用の修正点
+0

こんにちはGabriele、私はあなたのAVCamプロジェクトを見てきました。 'ARC compatible'コメントを 'ARC exclusive'に変更することができますか? ARC以外のプロジェクトに追加しましたが、ARC排他機能の使用に関するいくつかのコンパイルエラーがあります。 –

+0

@ RedNightingale確かに、言​​葉の恐ろしい選択。ところで、ARC以外のプロジェクトでも特定のファイルに対してARCを選択的に有効にすることができます。それが役に立てば幸い。 –

+0

私はそれを調べます。 Appleのコードの新しいリビジョンを試してみましたが、最終的には正常に動作しているようですので、これを答えとして宣伝します。 –

16

すべてのAVCamファイルのdeallocメソッドに最初にログインしました。私は、AVCamViewControllerがあったときにAVCamCaptureManagerとAVCamRecorderが割り当て解除されていないことをすぐに発見しました。私はretainとreleaseの呼び出しをチェックして、バランスが取れているように見えたので、[captureManager release]にブレークポイントを設定し、リリースの後にretainCountが2であることを発見しました。(したがって、AVCamCaptureManager deallocは呼び出されませんでした。

次に、キャプチャマネージャの作成プロセスを進め、initメソッドが呼び出された直後に保持カウントが3であることを発見しました。

のinitメソッドを介してステッピングと、私は次の2行は、両方の保持カウントをインクリメントし、発見し、すべての行に保持カウントチェック:

てみる
[self setDeviceConnectedObserver=[notificationCenter addObserverForName:AVCaptureDeviceWasConnectedNotification object:nil queue:nil usingBlock:deviceConnectedBlock]]; 
[self setDeviceDisconnectedObserver=[notificationCenter addObserverForName:AVCaptureDeviceWasDisconnectedNotification object:nil queue:nil usingBlock:deviceDisconnectedBlock]]; 

私はremoveObserverの対応は、deallocメソッドINSIDEだったことが判明し

-(void)removeObservers { 
    NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter]; 
    [notificationCenter removeObserver:[self deviceConnectedObserver]]; 
    [notificationCenter removeObserver:[self deviceConnectedObserver]]; 
} 
:保持カウントはそれを修正するには0

に低下したことがない(と呼ばれていませんでした)AVCamCaptureManagerのと私は新しい公共removeObserversメソッドを作成しました

と同じ行をAVCamCaptureManager deallocメソッドのOUTから取り出します。

[captureManager removeObservers]を呼び出します。 [captureManager release]を呼び出しています。 AVCamViewControllerのdeallocメソッドは、保持カウントを0に正常に落とします。

Activity Monitorでのテストでmediaserverdプロセスが5-17Mbでハミングし、クラッシュが停止しました!

これは、この問題を抱えている人に役立ちます。

+1

より良い...偉大なSOの神々は今私自身の質問に答えることができました;) –

+0

偉大なSOの神々は私にそれを与えることで感謝を言わせてくれました+1;) – sehe

+0

良い説明。この同じ問題が発生したと私は信じています。 –

2

最近この問題に遭遇しました。私は、実際の根本的な問題は、deviceConnectedBlockとdeviceDisconnectedBlockが暗黙のうちに自己を参照しており、サイクルを保持することにあるということでした。これを修正するには、それらのブロック内のすべてのivar参照をweakSelfを使用するように変更します。

このようにして、ティアダウンメソッドを明示的に呼び出す必要はありません。

これは他の人に役立つことを願っています。

REF:View controller dealloc not called when using NSNotificationCenter code block method with ARC

+0

私はブロック内の自己への参照を1つ持っていた。私はそれをweakSelfに置き換え、「通常の」AVCAMリリースコードに戻しました。 CaptureManagerはまだdeallocを呼び出していません。あなたがリンクしている記事は参照のために__weakを参照していますが、これはARCコード(現在は使用していません)にのみ適用されます。代わりに__blockを使用する必要がありますが、同等の解決策を思い付くには「ブロック」について十分理解できません。 –

関連する問題