【问题标题】:MKMapView initWithFrame not releasing memory with ARCMKMapView initWithFrame 不使用 ARC 释放内存
【发布时间】:2012-10-08 23:19:41
【问题描述】:

我一直在使用工具来查找未正确释放的分配。我有 MKMapViewDelegate 在实例化后通过实例方法添加地图。我可以在调用树中看到,在释放 ViewDelegate 后,此方法会保留大约 300KB 的内存。我注释掉了代码的内容,它仍然只用这一行来维护内存:

self.map = [[MKMapView alloc] initWithFrame:CGRectMake(10, 210, 300, 125)];

我查看对象列表,发现 MKMapView 本身并不存在,但随着我不断创建新的 ViewDelegates,内存不断增加。以下是地图的定义方式:

@property (strong, nonatomic)        MKMapView *map;

地图的delegate设置为nil,ViewDelegate的dealloc上的引用也是如此

self.map.delegate = nil;
self.map = nil;

【问题讨论】:

  • 用 release 代替 nil 怎么样。你能检查一下吗?
  • @S.P.他们正在使用 ARC,没有发布。
  • @S.P.没有其他人提及该财产,对吗?没有其他可能持有参考?
  • 我看错了这个 ViewDelegate 的 dealloc 已经放在那里了
  • 克里斯,没有对地图进行任何其他操作,也没有引用该属性。据我所知,地图对象也被正确释放,因为我可以看到它在仪器的对象视图中被创建并消亡。

标签: iphone ios memory-leaks mkmapview automatic-ref-counting


【解决方案1】:

一旦你将代理设置为 nil,就不再有任何指针,iOS 会在需要时释放它。 iOS 设置为 nil 后可能不会立即释放内存。

请记住,您通过将 指针 设置为 nil 来删除它,但该对象仍然保留在堆上,基本上什么都不做,直到那里分配了其他东西。

(我假设您还使用 [self.map removeFromSuperView] 从其父视图中删除了 MKMapView)。

【讨论】:

  • 仪器不能识别哪些内存实际上是活的和正在使用的吗?我知道内存中的对象存在直到被覆盖,但仪器的重点不是它显示应用程序仍然引用的内容,因此无法重新分配内存?我确实有具有 removeFromSuperView 的代码,但已被注释掉,并被添加为子视图。
猜你喜欢
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2014-02-10
相关资源
最近更新 更多