百度地图 (iOS SDK) 内存不回收

情景:有一个列表,点击列表中的某一条目后,进入详情页面,详情页面是一个地图。

环境:百度地图 iOS SDK v2.7.0

测试人员发现,从列表反复多次进入详情(push, pop, push, pop, …),五六次后程序崩溃。查看日志,发现是 Received Memory Warning。

通过 Xcode 的 Debug Navigator 监测,发现每进入一次地图页面,内存即增加占用约 20MB,但返回后内存并不回收。于是内存占用逐渐增多,直至被 kill。

继续监测程序的运行,发现地图页面在 pop 时,dealloc 方法并没有被执行,所以整个详情页面,包括地图,一直没有从内存中被 dealloc。

最终发现,除了百度地图的 mapView,在 self.view 上还有另一个 subview,而正因为这个 subview 没有 removeFromSuperView,导致了内存一直不能被回收。

含有百度地图的 viewWillDisappear 里一般是这样写的:

1
2
3
4
5
- (void)viewWillDisappear:(BOOL)animated {
[_bmkMapView viewWillDisappear];
[_bmkMapView setDelegate:nil];
[super viewWillDisappear:animated];
}

但此时需要这样写:

1
2
3
4
5
6
7
8
- (void)viewWillDisappear:(BOOL)animated {
[_bmkMapView viewWillDisappear];
[_bmkMapView setDelegate:nil];
for (UIView *view in [self.view subviews]) {
[view removeFromSuperview];
}
[super viewWillDisappear:animated];
}

另外,还有一些其他的情形也可能造成此类问题,基本原理是一致的,都是因为还有某个对象被引用着。内存的管理还是得加小心啊。