dictionary - iOS 6 MKMapView 内存泄漏并在一段时间后应用程序崩溃

标签 dictionary memory-leaks crash mkmapview ios6-maps

iOS 6 MKMapView 似乎使用了大量内存,当我们开始缩放并在应用程序中使用 map View 时(大约 7-10 分钟),当我们退出具有 MKMapView 的 Controller 时,它的一些如何不释放总内存(我在我的应用程序中使用 ARC)。我正在通过 NIB 分配和初始化 MKMapView。

Controller 1 --> Controller 2(具有 MKMapView)

1.5MB -->40-60MB(我已经使用 Instruments 来查找泄漏,但没有用)

当我回到 Controller 1时,实时字节似乎是7-10MB,每次访问 Controller 2后,实时字节大约有2-3MB的增量,一段时间后它使应用程序崩溃,在控制台中它说“收到内存警告”。有人可以帮忙吗?如果您需要更多信息,请告诉我。提前致谢。

最佳答案

这是因为 MKMapView 的工作方式。有一个操作待处理,因此 MapKit 保留了 MKMapView 并且它实际上还没有被释放。这本身并不是问题。问题是它仍在向您的委托(delegate)发送消息。

解决方法很简单:作为 View Controller 清理的一部分,将 map View 的委托(delegate)设置为 nil,这将阻止 MKMapView 向其发送消息。

这记录在 MKMapViewDelegate 协议(protocol)引用中:

在释放已设置委托(delegate)的 MKMapView 对象之前,请记住将该对象的委托(delegate)属性设置为 nil。您可以执行此操作的一个地方是在 dealloc 方法中处理 map View 。

编辑:也给 Oscar 点赞,就在下面,他在此处提供了文档引用。

考虑到 ARC,我建议这意味着您应该在 View Controller 的 dealloc 中将 map View 的委托(delegate)设置为 nil。

您可以执行类似的操作来解决我的问题。更改 map 类型也有帮助。

- (void)applyMapViewMemoryHotFix{

switch (self.mapView.mapView.mapType) {
    case MKMapTypeHybrid:
    {
        self.mapView.mapView.mapType = MKMapTypeStandard;
    }

        break;
    case MKMapTypeStandard:
    {
        self.mapView.mapView.mapType = MKMapTypeHybrid;
    }

        break;
    default:
        break;
}
self.mapView.showsUserLocation = NO;
self.mapView.delegate = nil;
[self.mapView removeFromSuperview];
self.mapView = nil;
}

-(void)viewDidDisappear:(BOOL)animated
{
    [self applyMapViewMemoryHotFix];
}

关于dictionary - iOS 6 MKMapView 内存泄漏并在一段时间后应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15922927/

相关文章:

python - 如何使用python在同一个字典中调用方法

c - c中字典实现的问题

java - 检查 Java Map<T, ?延伸 E>

tomcat - 无法取消部署 Tomcat 7 中的 Web 应用程序

C malloc valgrind - 在我的单链表实现中未初始化的内存

python - 这是将两个字典的字典合并在一起并对相似值求和的最佳方法吗

c - 二维数组内存分配出错时如何正确释放

android - 有时属性未初始化

android - 如何设置imageButton单击以打开其他布局?

ios - 当键盘为 numberPad、phonePad 或 DecimalPad 时应用程序崩溃(iOS 12.2、Xcode 10.2)