7

GMSMapViewを作成および破棄する単純なUIViewControllerを作成しました。

- (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 ;
}

私はAllocationsインストゥルメントでInstrumentsを使用しました。テストは簡単です。UINavigation ViewControllerで、ビューをプッシュし、押し戻して繰り返します。上記のGMSMapViewを含むビューをプッシュおよびポップするたびに約40kbのリークが発生します。これを説明するためにInstrumentsのスクリーンショットがありますが、stackoverflowでは投稿できません。興味があればメールで誰かに送ることができます。

私は何か間違ったことをしているのですか、それとも何かを逃しているのですか?

4

1 に答える 1

2

私にとってうまくいったのは、私が@try持っていた句を削除することでしたdealloc:

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

私の意図はself、ViewController が割り当て解除されたときにオブザーバーとして削除し (皮肉なことにメモリの問題を回避するため)、オブザーバーでない場合は例外を無視することでした。

どうやらどうやら@trymapViewを保持しているため、(ARC経由で)メモリにとどまります。ここで理由を確認してください: Objective-C の「try catch」でメモリ リークが発生するのはなぜですか? .

@try句を削除した後(およびremoveObserver例外を回避するためにいくつかのフラグを設定した後)、メモリは正常に動作するようになりました!

于 2016-11-01T15:30:27.820 に答える