MKMapView释放内存

2024-03-25

我遵循了几个SO问题中提供的建议,例如this one https://stackoverflow.com/questions/20138419/stop-ios-7-mkmapview-from-leaking-memory,为了释放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 的内存分配记录。

两个红旗(Generations)表示我显示之前的状态MKMapView在模态视图控制器中以及在我关闭它之后。MKMapView似乎被释放了。例如,如果我在仪器中过滤统计堆栈MKMapView,该对象确实在模态视图呈现时出现,并在关闭后消失。然而,在关闭地图视图后,我仍然有 30+ MB 的内存尚未释放。

B 代(第二个危险信号)数据显示有大量对象(和非对象)持有该内存。

When I look at extended details of one of those instances, it usually shows a stack trace that features private classes that, I guess, are related to map drawing enter image description here

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


在我的应用程序中,它在选项卡视图控制器的控制下使用地图视图控制器,我存储了对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];
}

Here, configureView:设置地图self.tabBarController.detailItem,设置其委托并将地图注释存储在变量中annotations.

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MKMapView释放内存 的相关文章

随机推荐

  • JavaScript 命令在 Safari 中未按顺序执行

    我在处理另一个问题时发现了这个错误 列出的 JavaScript 命令的顺序与其在 Safari 中的执行顺序不同 Example alert here document write This is the hidden message a
  • 使用 json.net 反序列化时是否保留数组顺序?

    当我使用 json net 库将 json 对象反序列化为 c 对象时 数组属性中元素的顺序是否会保持不变 例如 public class MySonsThreeFootRadius public Boolean IsMessy get s
  • Wymeditor 跨子域。 (跨站点权限问题。)

    我在 sub1 domain com 上有 wymeditor 它是通过 sub2 domains com 上的页面访问的 这行给出了一个错误 var styles this doc styleSheets 0 权限被拒绝http remo
  • 如何解决这个奇怪的Python编码问题?

    我正在对来自网络的字符串语料库执行一些 NLP 任务 正如您所期望的 存在编码问题 以下是一些示例 they don t serve sushi the apostrophe in don t is not standard but xe2
  • 未捕获的 PHP 异常 Doctrine\ORM\ORMException:“未知实体命名空间别名‘AppBundle’。”

    我刚刚开始使用 Composer 开始我的第一个项目 并想为其设置数据库和类 然而我被困住了 我在 prod log 中收到上述错误 我在这里遵循了本教程 http symfony com doc current book doctrine
  • printf 转换 long long 时出现问题

    我一直在研究一个项目欧拉问题 该问题本质上迫使您使用具有大存储空间的数据类型 include
  • Eclipse 未找到添加到构建路径的类(Java 动态 Web 项目)

    我正在接手学校的一个网络项目 我正在尝试在 eclipse 中部署该项目 该项目使用了一组库 即javax mail com sun mail org joda and org apache 该项目无法编译 因为它无法找到这些 我将它们放在
  • PowerShell 连接到 Postgres DB

    您能否告知是否有一种方法可以从 PowerShell 连接到 Postgres SQL DB 而无需安装任何数据库驱动程序 我正在寻找能够仅使用 NET 数据库功能进行连接的解决方案 谢谢 Matthew 根本不需要客户端驱动程序 您只需执
  • tidyverse 计算多列中每行的排名

    我有以下数据框 dat lt data frame id c a b c d x1 c 1 3 5 7 x2 c 4 2 6 0 x3 c 2 2 5 9 我现在想计算排名per row跨越我的三个 x 列 并希望将该结果存储到我的dat数
  • 自动将进入/退出功能日志添加到项目中

    我有一个第三方源代码 我必须对其进行调查 我想查看函数的调用顺序 但我不想浪费时间输入 printf Entered into s FUNCTION and printf Exited from s FUNCTION 对于每个函数 我也不想
  • mongodb获取计数而不重复查找

    在 MongoDb 中执行查询时 我需要获取所有匹配项的总数 以及作为有限 分页子集的文档本身 我可以通过两个查询来实现这一目标 但我不知道如何通过一个查询来实现这一目标 我希望有一个 mongo 功能 在某种意义上相当于 SQL CALC
  • 使用 Angularjs 将视图状态存储在 URL 中

    将视图状态存储为 URL 的一部分的一般共识是什么 如果有 Angularjs我该如何去做呢 我有一个相当复杂的视图 路线 有许多要设置的过滤器 选项卡等 这些都会导致视图状态 我看到了将所有这些视图组件的状态存储为 URL 的一部分的优势
  • 如何使用 python sub 删除

    我有一个 html 文件 我想用空格替换空段落 mystring This p p p is a test p p p p p result mystring sub p p nbsp 这是行不通的 Please 不要尝试使用正则表达式解析
  • 使用简单 PHP 代理的跨域 getJson 请求

    您好 我正在尝试从仅返回 JSON 而不是 JSONP 的 api 获取数据 每次我尝试以 JSONP 方式连接数据时 它都不起作用 因为我不期望 JSON 所以 我想我必须使用 PHP 代理来解决跨域问题 以便我可以解释 JSON 请求
  • 如何从 org.apache.spark.mllib.linalg.VectorUDT 转换为 ml.linalg.VectorUDT

    我正在使用 Spark cluster 2 0 我想将向量转换为org apache spark mllib linalg VectorUDT to org apache spark ml linalg VectorUDT Import L
  • 根据特定列从列表中删除重复行

    我相信这类似于this https stackoverflow com questions 25324066 distinct a list of records based on two column using groupby但我无法应
  • Rails Devise http 验证移动设备

    我正在尝试向我的服务器 ruby on Rails 应用程序验证 Android 客户端应用程序 该应用程序使用 Devise gem 但我尝试过 http 身份验证 并发布请求进行身份验证 并且服务器仅对任何给定的用户名 密码响应 200
  • 将具有不同列的大数据文件合并为一个大文件

    我有 N 个制表符分隔的文件 每个文件都有一个标题行 说明列的名称 有些列是所有文件共有的 但有些列是唯一的 我想将所有文件合并成一个包含所有相关标头的大文件 Example gt cat file1 dat a b c 5 7 2 3 9
  • 为 matplotlib 文本设置固定位置

    虽然有几个问题与我的问题类似 但几乎所有问题都与文本框 图例和注释有关 使用循环 我想显示 32 个属性的具体信息 左侧的直方图和右侧的统计信息 仅处理一个属性非常简单 我将 x y 设置为文本位置 就是这样 Histogram sns d
  • MKMapView释放内存

    我遵循了几个SO问题中提供的建议 例如this one https stackoverflow com questions 20138419 stop ios 7 mkmapview from leaking memory 为了释放MKMa