集成过高德地图的猿猿们应该都清楚,创建地图内存消耗非常大,而且加载过的地图内存一直得不到释放,如果项目中频繁用到地图会出现内存爆炸,最好是用单例创建。
YLAMapViewSingle派生自NSObject,.h&.m代码如下
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface YLAMapViewSingle : NSObject
+(YLAMapViewSingle *)sharedMapView;
@property (nonatomic, strong) MAMapView *mapView;
@end
NS_ASSUME_NONNULL_END
我这里的处理是,只负责创建地图,地图样式在具体使用的地方设置,当然每个应用的使用场景不同,比如我们的应用中有的页面使用A样式有的页面使用B样式,因为用单利会缓存之前地图设置的属性,故要在指定页面单独设置属性。
如果是应用内地图统一样式,可以在单例这里直接设置属性,这样用起来就方便多了。
#import "YLAMapViewSingle.h"
@implementation YLAMapViewSingle
+(YLAMapViewSingle *)sharedMapView
{
static YLAMapViewSingle *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[YLAMapViewSingle alloc] init];
single.mapView = [MAMapView new];
});
//清除大头针和轨迹是因为有可能带有上个地图的UI
if (single.mapView.overlays.count)
{
[single.mapView removeOverlays:single.mapView.overlays];
}
if (single.mapView.annotations)
{
[single.mapView removeAnnotations:single.mapView.annotations];
}
return single;
}
使用YLAMapViewSingle
#pragma mark - lazy load
-(MAMapView *)mapView
{
if (!_mapView) {
_mapView = [YLAMapViewSingle sharedMapView].mapView;//获取单例地图
_mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_mapView.rotateCameraEnabled = NO;//禁用倾斜手势
_mapView.rotateEnabled = NO;//禁用旋转手势
_mapView.showsIndoorMap = NO;//YES:显示室内地图
_mapView.zoomLevel = 19;//缩放级别(默认3-19)
_mapView.showsScale = NO;//设置成NO表示不显示比例尺
_mapView.showsCompass = NO;//设置成NO表示关闭指南针
_mapView.showsLabels = NO;
_mapView.customizeUserLocationAccuracyCircleRepresentation = YES;
NSString *path = [NSString stringWithFormat:@"%@/MaMapYuanShanDai.data", [NSBundle mainBundle].bundlePath];
NSData *data = [NSData dataWithContentsOfFile:path];
[_mapView setCustomMapStyleEnabled:YES];
[_mapView setCustomMapStyleWithWebData:data];
///把地图添加至view
[self.view addSubview:_mapView];
[_mapView mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));
}];
}
return _mapView;
}
以上。
网友评论