Xcode
iOS
Swift

iOS10だとUISearchControllerでメモリリークする

UISearchControllerを使って以下のような画面を作る時、

なにも意識しないで実装すると画面遷移時に遷移した先でSearchBarが残ってしまうことがあります。

この対処法として、遷移元の ViewControllerviewDidLoaddefinesPresentationContext = true と書く方法をよく見かけます。
参考:
https://qiita.com/color_box/items/d13b04a88587088019af
https://stackoverflow.com/questions/29472011/uisearchcontroller-persisting-after-segue

しかし、definesPresentationContext = trueとするだけだと、iOS10では2番目のViewControllerから1番目のViewControllerへ戻るときにリークします。
Debug Memory Graphで見てみると、以下のように TableViewController_UISearchPresentationController によって保持されているのがわかります。
スクリーンショット 2017-12-11 21.48.35.png

リークしないようにするには、遷移する前に searchController.active = false をするのを忘れないようにしましょう。

もしくは、SearchBarを tableView.tableHeaderView ではなく、ナビゲーションバーに置くと、definesPresentationContext = true を書かなくても遷移先でSearchBarが残ってしまったりUIが崩れたりしないのでUIを変えるというのも手かもしれません。

以上、UISearchControllerのTipsでした。

ちなみに上述のDebug Memory Graphは便利なので使ったことない人は使ってみるといいと思います。
以下の記事が詳しくまとまっています。
https://qiita.com/ikezzi/items/b6f9eaf4f093cda3a95d