現象
SDWebImage と WKWebView を使ったアプリを iOS 10 上で動かして、画像をたくさん読み込むと以下のエラーが出て終了する。デバッガには落ちてくれない。
#WK: Unable to acquire assertion for process 0
メモリの問題かと思ったけど、didReceiveMemoryWarning は呼ばれない。
調査
エラーメッセージで検索したら次の2つが引っかかった。
WebKit のソースを読んでもよくわからない。BKSProcessAssertion とかいう内部クラスを使ってるし。でも、pid = 0 っておかしい気がする。
Stackoverflow の質問は、JavaScript と WebGL だから関係ない筈…。
対処
とりあえず SDImageCache の maxMemoryCountLimit を設定したら落ちなくなった。maxMemoryCost でもいいと思う。
SDImageCache.sharedImageCache().maxMemoryCountLimit = 100
考察 憶測
たぶん、iOS 10 では UIImage や WebKit が GPU をたくさん使うようになって、メインメモリではなく GPU のメモリを奪い合って落ちてるんだと思う。
追記
機種によっても症状は変わって、
- iPhone 5 ... メモリ警告が出て、問題なく動く (GPU 使ってない?)
- iPhone 5s, 6 ... 落ちる
- iPhone 7 ... 問題なし (GPU に余裕がある?)
だったりします。