MKMapView的initWithFrame在ARC下无法释放内存

5

我一直在使用工具来查找未正确释放的分配。我有一个MKMapViewDelegate,在实例化后通过一个实例方法添加地图。我可以看到在ViewDelegate被释放后,这个方法仍然保留着大约300KB的内存。即使我注释掉了代码的主体部分,只剩下这一行代码,它仍然保持着内存:

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

我查看了对象列表,MKMapView本身没有存活,但是随着我不断创建新的ViewDelegates,内存不断增加。这是地图定义的方式:

@property (strong, nonatomic)        MKMapView *map;

地图的委托被设置为nil,同时在ViewDelegate的dealloc中引用也被释放了。
self.map.delegate = nil;
self.map = nil;

你觉得使用 release 而不是 nil 怎么样?你能在你的端检查一下吗? - S.P.
2
@S.P. 他们正在使用ARC,不需要释放。 - Chris Wagner
@S.P. 没有其他人引用那个属性,对吧?没有其他可能保留引用的东西吗? - Chris Wagner
我误以为这个ViewDelegate的dealloc已经被放在那里了。 - S.P.
Chris,地图上没有做任何其他操作,也没有引用该属性。据我所知,地图对象也被正确释放了,因为我可以在仪器的对象视图中看到它被创建和销毁。 - spedly
1个回答

1

一旦您将委托设置为nil,就不再有任何指针,iOS会在它想要释放时释放它。iOS可能不会在将其设置为nil后立即释放内存。

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

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


仪器难道不会识别哪些内存实际上是正在使用的吗?我明白在内存中,对象存在直到被覆盖,但是仪器的重点不就在于显示应用程序仍然引用的内容,因此那些内存无法重新分配吗?我的代码确实有removeFromSuperView,但它被注释掉了,同时也作为子视图添加进去了。 - spedly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接