iOS 8 でメモリ不足が原因でカスタム キーボードが終了する
最初、私のカスタム キーボードは約 25 MB のメモリを使用していますが、このメモリはキーボードを破棄しても解放されません。カスタム キーボードを何度も開くと、メモリが増加し続け、最終的にメモリ不足のために終了します。
この問題について教えてください。
iOS 8 でメモリ不足が原因でカスタム キーボードが終了する
最初、私のカスタム キーボードは約 25 MB のメモリを使用していますが、このメモリはキーボードを破棄しても解放されません。カスタム キーボードを何度も開くと、メモリが増加し続け、最終的にメモリ不足のために終了します。
この問題について教えてください。
KeyboardViewController の ViewWillDisappear 関数でいくつかのものを解放できます
キーボード拡張機能は、キーボードが消えた後も持続するプロセスで実行されます。キーボードが作成されるたびに、キーボードのView Controllerが新しく作成されますが、View Controllerが存在するプロセスは持続します。したがって、View Controller を閉じたときにメモリを解放してください。画像を使用している場合は、imageNamed: を使用したくない場合は、imageWithContentsOfFile: を使用する必要があります。UIImage は永続化される imageNamed のキャッシュを使用するためです。
私はこの有名なメモリ蓄積の問題を回避するためにたくさんの方法を試しましたが、私の長い長い試行錯誤によると、キーボードが消える前にすべてのメモリを解放する最善かつ最も簡単な方法は、 of を呼び出すexit(0)
ことviewWillDisappear
ですKeyboardViewController
。
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
exit(0);
}
[更新] exit(0)
は、キーボード拡張プロセスを強制終了するため、すべてのメモリを解放するのに最適でした。残念ながら、プロセスを強制終了すると iOS が不安定になるようです。
したがって、最も安定した方法は、割り当てられたすべてのオブジェクトを で可能な限り解放することですviewWillDisappear
。例えば、
すべてのカスタム ビューとすべてのカスタム ビュー コントローラーの場合
サブビュー、制約、ジェスチャ、強力なデリゲートなど、ビューとビュー コントローラーのすべての強い参照を削除します。
[aView removeFromSuperview];
[aView removeConstraints:aView.constraints];
for (UIGestureRecognizer *recognizer in aView.gestureRecognizers)
[aView removeGestureRecognizer:recognizer];
nil
ビュー コントローラのすべてのオブジェクト プロパティに設定します。
aViewController.anObject = nil;
その他の大きなカスタム オブジェクトの場合
追加されたすべてのオブジェクトをすべての配列、辞書などから削除します。
[anArray removeAllObjects];
を使用して画像をキャッシュしないでくださいimageNamed:
。
十分に解放された場合、デバッグ中のメモリ使用量は増加しないか、わずかに増加します (閉じるたびに 0.1M バイト未満)。カスタム オブジェクトを可能な限り解放しても、何度も破棄してメモリ使用量が増加した場合、exit(0) が定期的に呼び出され、アンロードのリスクが生じる可能性があります。