记高德地图引起的一个bug修复
高德地图,原先我们在这里设计的方法是全局共享一个地图的实例,在用的时候现取这个对象,而在上个版本中我们由于重构了一次代码,导致地图在该页面使用后其他页面用不了了而出现崩溃的问题。无奈为了解决线上用户的崩溃问题,我只能通过jspatch将取地图的方法设置为每次都重新alloc init 一个对象,但是这样一来崩溃的问题虽然看似解决了,但是却引发了一个地图的内存问题,当频繁的使用地图的时候就会导致在内存中不断的创建对象而内存越来越大终于被系统杀死了。
在这期心的迭代开发中,我研究了一下重构的代码,一开始被一个错误的方向误导了,因为代码中有一个延时地图的gcd方法,我一直一度地认为地图的问题就是它引起的,结果一直找啊找,最终无果。后来终于偶然发现了这个问题的解决办法,居然是因为它???太不可思议了。。。。。。
原来测试代码:
self.mapView = [[MAMapView alloc]init];
self.mapView.delegate = nil;
self.mapView.mapType = MAMapTypeStandard;
self.mapView.userTrackingMode = MAUserTrackingModeNone;
self.mapView.showsCompass = NO;
self.mapView.showsScale = NO;
[self.mapContentView insertSubview:self.mapView atIndex:0];
[self.mapView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.mapContentView);
}];
更改后的代码逻辑如下
self.mapView = [[ZCMapManager sharedZCMapManager]getMAPView];
self.mapView.frame = self.mapContentView.bounds;
self.mapView.showsUserLocation = YES; // yes
self.mapView.delegate = nil;
[self.mapContentView insertSubview:self.mapView atIndex:0];
仔细一看,我惊呆了,居然是因为autolayout,目前尚不明确Masonry为什么会对地图做一个强的控制,导致一旦地图在这个地方用了之后,其他地方在想用这个对象取到的地图不为空,但是就是展示不出来,目前这个问题算是基本解决了,深揪其原因那就不得而知了。。。