GMSMapView中的内存泄漏

时间:2013-03-15 23:45:01

标签: google-maps-sdk-ios

我创建了一个简单的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不允许我发布它。如果有兴趣,我可以通过电子邮件发送给某人。

我做错了什么或错过了什么?

1 个答案:

答案 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以避免异常)后,内存恢复正常运行!