Ios MKMapView释放内存

Ios MKMapView释放内存,ios,objective-c,memory,mkmapview,Ios,Objective C,Memory,Mkmapview,我遵循了几个SO问题中的建议,例如,为了从内存中释放MKMapView——下面是我的代码 - (void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; self.map.mapType = MKMapTypeHybrid; self.map.showsUserLocation = NO; self.map.delegate = nil; [self.map re

我遵循了几个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;
}
它在一定程度上起作用,但不是完全起作用。让我提供一些数据

下面是仪器的内存分配记录

这两个红色标志(代)指示在模态视图控制器中显示
MKMapView
之前和我将其取消后的状态<代码>MKMapView似乎被取消分配。例如,如果我在Instruments For
MKMapView
中过滤统计堆栈,则当显示模态视图时,对象确实会出现,一旦关闭,对象就会消失。然而,在取消地图视图之后,我仍然有30+MB的内存没有释放出来

生成B(第二个红旗)数据显示,有大量对象(和非对象)持有此内存

当我查看其中一个实例的扩展细节时,它通常会显示一个堆栈跟踪,该跟踪以私有类为特征,我猜这些私有类与地图绘制相关


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

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

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

该映射成为interface builder中定义的视图的子视图(实例变量
@property(弱、非原子)IBOutlet UIView*mapViewProxy;
)。贴图必须获得与
mapViewProxy
相同的大小,并且当我使用autolayout时,
\u mapView
的帧大小完全使用
addConstraints
中设置的约束进行控制(顶部、底部、左侧和右侧等于
\u mapView.superview

我发现必须从
viewdispear:
中的地图中删除注释,然后将它们添加回
viewdispear
。在
viewdispear:
中取消设置
\u mapView.delegate
并在
viewdispear:
中将其设置回原处可能会更干净


顺便说一句:静态变量
\u mapView
仍然错误地带有前导下划线,因为它在IB中定义
MKMapView
之前是一个实例变量。

这是我使用的解决方案,它工作正常。我认为这个问题是最近才出现的,因为我以前在同一个项目中没有遇到过地图分配的问题

我将map实例存储在一个单例中,并在创建一个新实例之前检查它是否存在。即:

if let existingMapView = LocationSingleton.sharedInstance.singletonMapView {

    //Display map
}else{

    let newMapView = //Instantiate new map view controller
    LocationSingleton.sharedInstance.singletonMapView = newMapView

    //Display map
}

你解决了这个问题吗?不幸的是,还没有。现在有没有什么好运气来清除记忆?唉。有一次,我还将
self.locationManager
设置为
nil
,它似乎有帮助,但没有,内存仍然被分配。
if let existingMapView = LocationSingleton.sharedInstance.singletonMapView {

    //Display map
}else{

    let newMapView = //Instantiate new map view controller
    LocationSingleton.sharedInstance.singletonMapView = newMapView

    //Display map
}