MKMapView发布内存

art*_*ras 5 memory objective-c mkmapview ios

我已经按照几个SO问题提供的建议,比如这个问题,以便MKMapView从内存中释放- 我的代码如下

- (void)viewDidDisappear:(BOOL)animated {

    [super viewDidDisappear:animated];

    self.map.mapType = MKMapTypeHybrid;
    self.map.showsUserLocation = NO;
    self.map.delegate = nil;
    [self.map removeFromSuperview];
    self.map = nil;

    self.locationManager.delegate = nil;
}
Run Code Online (Sandbox Code Playgroud)

在某种程度上,它有效,但不完全.我来提供一些数据.

以下是Instruments的内存分配记录.

在此输入图像描述

两个红色标记(Generations)表示我MKMapView在模态视图控制器中显示之前的状态以及我解除它之后的状态.MKMapView好像被解除了分配.例如,如果我在Instruments中过滤Statistics堆栈,则在MKMapView呈现模态视图时确实会出现该对象,并且一旦关闭它就会消失.但是,在取消了地图视图后,我仍然有30多MB的内存尚未被释放.

第B代(第二个红旗)数据显示存在大量保存此内存的对象(和非对象).

在此输入图像描述

当我查看其中一个实例的扩展细节时,它通常会显示一个包含私有类的堆栈跟踪,我猜这些私有类与地图绘制有关 在此输入图像描述

有谁知道如何释放所有数据?我可以/应该清理一些缓存吗?

vil*_*rte 1

在我的应用程序中,它使用选项卡视图控制器控制下的地图视图控制器,我将对 a 的引用存储MKMapView在静态变量中,并一遍又一遍地使用同一地图视图,而不是ViewDidLoad每次都分配一个新的地图视图。我的(部分)代码:

@implementation PubMapViewController {
    NSMutableArray *annotations;
}
static MKMapView *_mapView = nil;

- (void)viewDidLoad {
    [super viewDidLoad];
    if (!_mapView) {
        _mapView = [[MKMapView alloc] init]; // frame set up with constraints
    } else {
        [_mapView removeAnnotations:_mapView.annotations]; // precaution
    }
    [_mapViewProxy addSubview:_mapView];
    [self addConstraints:_mapView];
    [self configureView:((PubTabBarController *)self.tabBarController).detailItem];
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [_mapView addAnnotations:annotations];
    if (annotations.count == 1) {
        [_mapView selectAnnotation:annotations[0] animated:YES];
    }
}

- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
    [_mapView removeAnnotations:_mapView.annotations];
}
Run Code Online (Sandbox Code Playgroud)

在这里,configureView:设置 的映射self.tabBarController.detailItem,设置其委托并将映射注释存储在变量 中annotations

该地图成为界面构建器中定义的视图的子视图(实例变量@property (weak, nonatomic) IBOutlet UIView *mapViewProxy;)。地图必须获得与 相同的大小mapViewProxy,并且当我使用自动布局时, 的帧大小完全使用(上、下、左、右等于)_mapView中设置的约束来控制。addConstraints_mapView.superview

我发现必须从 中的地图中删除注释viewDidDisppear:并将它们添加回 中viewDidAppear_mapView.delegate拆下viewDidDisppear:再装回去可能会更干净viewDidAppear

顺便说一句:静态变量_mapView仍然误导性地带有前导下划线,因为它在通过定义 IB 设置之前是一个实例变量MKMapView