Ios MKMapView释放内存
我遵循了几个SO问题中的建议,例如,为了从内存中释放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
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 ForMKMapView
中过滤统计堆栈,则当显示模态视图时,对象确实会出现,一旦关闭,对象就会消失。然而,在取消地图视图之后,我仍然有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
}