ios - MKMapView 释放内存

标签 ios objective-c memory mkmapview

我遵循了几个 SO 问题中的建议,例如 this one , 为了从内存中释放 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;
}

部分有效,但不完全有效。让我提供一些数据。

下面是Instruments的内存分配记录。

enter image description here

两个红旗(世代)表示我在模态视图 Controller 中显示 MKMapView 之前和关闭它之后的状态。 MKMapView 似乎被释放了。例如,如果我在 Instruments 中为 MKMapView 过滤 Statistics 堆栈,则该对象确实会在呈现模态视图时出现,并在它关闭后消失。但是,关闭 map View 后,我还有 30+ MB 的内存未释放。

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

enter image description here

当我查看其中一个实例的扩展详细信息时,它通常会显示一个堆栈跟踪,其中包含私有(private)类,我猜这些私有(private)类与 map 绘制有关 enter image description here

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

最佳答案

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

@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];
}

在这里,configureView:self.tabBarController.detailItem 设置 map ,设置其委托(delegate)并将 map 注释存储在变量 annotations 中.

map 是在界面生成器中定义的 View 的 subview (实例变量 @property (weak, nonatomic) IBOutlet UIView *mapViewProxy; )。 map 必须获得与 mapViewProxy 相同的大小, 当我使用自动布局时,框架大小为 _mapView完全使用 addConstraints 中设置的约束进行控制(顶部、底部、左侧和右侧等于 _mapView.superview )。

我发现必须从 viewDidDisppear: 中的 map 中删除注释并将它们添加回 viewDidAppear .取消设置可能会更干净 _mapView.delegateviewDidDisppear:并将其设置回 viewDidAppear .

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

关于ios - MKMapView 释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28633032/

相关文章:

python - 有效地折叠 Parquet 中的行组

ios - Xcode图像操作内存泄漏

macos - NSImage TIFFRepresentation 未随 ARC 一起发布

ios - 在实体 <NSSQLEntity Theaters id=3> 中找不到 coredata keypath nameOfMovie

ios - Xcode Storyboard显示与模拟器不同的设计?

ios - iOS 9 中的自定义字体问题?

iphone - Objective-C内存管理: caching view elements

ios - iOS 版 Twitter 分享照片功能

ios - 按钮出现在 SCNView 之前的屏幕上

objective-c - iOS - 构建失败,CocoaPods 找不到头文件