我创建了一个简单的UIViewController来创建和销毁GMSMapView。
- (void)viewDidAppear:(BOOL)animated
{
if ( !m_disappearing_bc_segue )
{
[super viewDidAppear:animated] ;
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude: self.location.latitude
longitude: self.location.longitude
zoom:9 ] ;
m_mapView = [GMSMapView mapWithFrame:CGRectMake(0, 0, 320, 420) camera:camera];
m_mapView.myLocationEnabled = NO ;
[m_mapView setMapType: kGMSTypeTerrain] ;
m_mapView.delegate = self ;
[self.view addSubview:m_mapView] ;
[self.view sendSubviewToBack:m_mapView] ;
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated] ;
[m_mapView clear] ;
[m_mapView stopRendering] ;
[m_mapView removeFromSuperview] ;
m_mapView = nil ;
}
我使用了仪器和分配仪器。测试很简单。在UINavigation ViewController中,按下视图,回击并重复。每次推送和弹出包含上述GMSMapView的视图时,大约有40kb泄漏。我有一个来自仪器的截图来说明这一点,但stackoverflow不允许我发布它。如果有兴趣,我可以通过电子邮件发送给某人。
我做错了什么或错过了什么?
答案 0 :(得分:2)
对我有用的是删除@try
中的dealloc
条款:
@try {
[self.mapView removeObserver:self forKeyPath:@"myLocation"];
}
@catch (NSException *exception) {
}
我的意图是当ViewController被解除分配时(删除内存问题)剔除self
作为观察者,如果它不是观察者则忽略该异常。
显然@try
以某种方式保留了mapView,这使得它留在内存中(通过ARC)。在此处查看原因:Why does "try catch" in Objective-C cause memory leak?。
删除@try
子句(并使用某个标志调整removeObserver
以避免异常)后,内存恢复正常运行!