2013-03-15 22 views
6

GMSMapViewを作成して破棄する単純な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 ; 
} 

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

私は何か間違っているか何かを逃していますか?私の意図は、(皮肉にもメモリの問題を回避するため)のViewControllerがdealloc'dされたときにオブザーバーとしてselfを削除することでした、と

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

:どのような私のために働いていた私はdeallocに持っていた@try句を削除した

+0

いつも 'GMSMapView'を再作成する必要がありますか? –

+0

m_mapView.delegate = nilを追加する可能性があります。前にm_mapView = nilと言って解決しますか?それは... –

+0

@ SergeyKuryanov基本的にメモリを解放します。各GMSMapViewは重大なメモリを消費します。私はミニビュー(画面の半分)を持っていて、ボタンを押すと最大化されたバージョンが表示されます。私が最大化されたバージョンから戻るとき、私はそれを放棄したい。 – user2101384

答えて

2

オブザーバでない場合は例外を無視します。

明らかに@tryは何とかmapViewを保持しているため、ARCを介してメモリに残ります。理由はこちらをご覧ください:Why does "try catch" in Objective-C cause memory leak?

@try節を削除してから(例外を回避するためにフラグを設定してremoveObserverを調整した後)、メモリは正常に動作しました。

関連する問題