7

我创建了一个简单的 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 ;
}

我已将 Instruments 与 Allocations 工具一起使用。测试很容易。在 UINavigation ViewController 中,推送视图,回击并重复。每次推送和弹出包含上述 GMSMapView 的视图时,大约有 40kb 泄漏。我有一张来自 Instruments 的截图来说明这一点,但 stackoverflow 不允许我发布它。如果有兴趣,我可以通过电子邮件发送给某人。

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

4

1 回答 1

2

对我有用的是删除我的@try条款dealloc

@try {
    [self.mapView removeObserver:self forKeyPath:@"myLocation"];
}
@catch (NSException *exception) {
}

我的意图是self在 ViewController 被释放时删除观察者(具有讽刺意味的是避免内存问题),如果它不是观察者则忽略异常。

显然@try以某种方式保留了 mapView,这使其保留在内存中(通过 ARC)。在这里查看原因:为什么 Objective-C 中的“try catch”会导致内存泄漏?.

删除@try子句(并removeObserver使用一些标志来避免异常)后,内存恢复正常!

于 2016-11-01T15:30:27.820 回答