內存持續增加的釋放解決辦法
最近修改一個用到MKMapView的項目,內存一直占用過多,每次拖拽地圖時還會增加占用,且一直無法釋放。
經過兩天的排查,最后鎖定是創建的self.map對象在加載地圖的時候,不斷申請內存,但在View的生命期內不會釋放。
查閱資料了解到removeFromSuperview可以釋放內存,但remove的話地圖會從父View上消失。
最后解決辦法是在- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated中加入了兩行代碼
[self.map removeFromSuperview];
[self.view addSubview:mapView];
在移除self.map的同時,重新加載mapView,兩行代碼就可以達到釋放內存的效果。
用Instruments測試顯示,之前不能釋放的內存可以釋放了。下圖中的Malloc 4.00MB 即為地圖申請的內存,總共申請164M,釋放132M后,程序平穩運行時的地圖內存只需要28M。
后續: 大頭針標注的點擊事件會出現沒有反應,懷疑是remove破壞了響應鏈,暫未找到解決辦法。
地圖縮放時出現錯誤提示
Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection was mutated while being enumerated.'
原因可能是線程沖突,解決辦法是添加標記,避免同時對地圖執行操作,可參考:
http://stackoverflow.com/questions/27273211/array-was-mutated-while-being-enumerated-swift