私が最初にしたことは、すべてのAVCamファイルのdeallocメソッドにログインすることでした。AVCamViewControllerが割り当て解除されていたときに、AVCamCaptureManagerとAVCamRecorderの割り当てが解除されていないことにすぐに気付きました。保持呼び出しと解放呼び出しを確認したところ、バランスが取れているように見えたので、[captureManagerリリース]にブレークポイントを設定し、リリース後に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の対応物がAVCamCaptureManagerのdeallocメソッド(呼び出されていなかった)の内部にあるため、保持カウントが0に低下することはありませんでした。
これを修正するために、新しいpublicremoveObserversメソッドを作成しました。
-(void)removeObservers {
NSNotificationCenter *notificationCenter = [NSNotificationCenter defaultCenter];
[notificationCenter removeObserver:[self deviceConnectedObserver]];
[notificationCenter removeObserver:[self deviceConnectedObserver]];
}
そして、AVCamCaptureManagerdeallocメソッドから同じ行を取り出します。
[captureManagerremoveObservers]を呼び出します。次に、[captureManagerリリース]を呼び出します。AVCamViewControllerのdeallocメソッドでは、保持カウントが0に正常にドロップされます。
Activity Monitorを使用したテストでは、mediaserverdプロセスがわずか5〜17 Mbでハミングし、クラッシュが停止します。
これがこの問題を抱えている他の人に役立つことを願っています!