2017-06-22 5 views
0

だから私は3つのビューコントローラ、名前、それを持っているINIT:MapVCでのiOSのObj-Cのビューを一度

- Dashboard 
- Map 
- Location List 

を、私はXMapViewのカスタムクラスで1つの大のUIViewを添付してください。 XMapViewの中で私はこのコードを持っています。

したがって、MapVCは基本的にXmapViewを挿入して表示します。

私はこのコードをMapVCコントローラに持っています。 MapVC内の.hファイルへのカスタムクラスでViewを上書きしたことに注意してください。

//.h file 
@property (strong, nonatomic) IBOutlet XMapView *mapStoreView; 

//.m file 
- (void)viewWillAppear:(BOOL)animated{ 
[super viewWillAppear:animated]; 

// this following code will load the Map from the XMapView to the MapVC 
[self.mapStoreView loadMap:self.results viewController:self selectedOutletFromList:self.selectedOutletFromList]; 
} 
- (void)viewWillDisappear:(BOOL)animated{ 
[super viewWillDisappear:animated]; 
[self.mapStoreView removeFromSuperview]; 
self.mapStoreView = nil; 
self.mapStoreView.mkMapView.delegate = nil; 
[self.mapStoreView.mkMapView removeAnnotations:self.mapStoreView.mkMapView.annotations]; 
self.results = nil; 
} 

シーケンスはダッシュボードです - > MapVC - >所在地一覧

テストケース:

1. Dashboard -> MapVC, map will load. 
2. MapVC -> Location List -> MapVC, map will not load. 
3. Dashboard -> MapVC -> Dashboard -> MapVC, map will always load. 

ここでの問題は何ですか?何か不足していますか?あなたのコードで

+0

なぜあなたは[self.mapStoreView removeFromSuperview]ですか; self.mapStoreView = nil;あなたはアウトレットからこれを作っており、あなたは再び割り当てられません。それは表示されていません。この –

+0

を削除しないでください。なぜなら、あなたはviewDidDisappearのマップを修正しているからです。 – KKRocks

+0

表示されていない場合は、DashboardからMapVCに来ると、なぜ読み込まれますか? – Alvin

答えて

0

- (void)viewWillDisappear:(BOOL)animated{ 
[super viewWillDisappear:animated]; 
[self.mapStoreView removeFromSuperview]; 
self.mapStoreView = nil; 
self.mapStoreView.mkMapView.delegate = nil; 
[self.mapStoreView.mkMapView removeAnnotations:self.mapStoreView.mkMapView.annotations]; 
self.results = nil; 
} 

あなたが新しいのViewControllerにプッシュそれがなくなっですので、あなたが戻って、あなたは、mapStoreViewを回復しなかったときに、スーパービューからあなたmapStoreViewを削除し、場所リストと呼ばれます。

viewDid新しいviewcontrollerをプッシュしたり、navigationControllerからpopしたり、新しいviewcontrollerを表示したり、セルフコントローラーを閉じたりするなど、selfが消えてしまった場合にDisposearが呼び出されます。

メモリーを解放したい場合は、コントローラーの割り振り解除時に呼び出されるdeallocメソッドでこれらのジョブを実行する必要があります。このような

:以下のように

 -dealloc 
     { 
[self.mapStoreView removeFromSuperview]; 
     self.mapStoreView = nil; 
     self.mapStoreView.mkMapView.delegate = nil; 
     [self.mapStoreView.mkMapView removeAnnotations:self.mapStoreView.mkMapView.annotations]; 
     self.results = nil; 
    } 
+0

私はあなたのdealloc関数を使用した後、メモリは減っていませんが、代わりにメモリリークが増え続けます – Alvin

+0

私はメモリを解放するために正確に仕事をしません。これは一例です。viewDidDisappearのコードを削除する必要がありますあなたの問題を解決し、メモリリークが問題である、あなたのコードを分析して、サイクルを保持し、それを解決するコントローラをfree.Fixメモリリークになるようにしてください常に複雑な仕事です – Jay

0

変更:

あなたが場所

から来ている間、それは負荷がそれはHomeVcしばらくMapVcにロードされますしませんので、あなたがmapStoreViewのIBOutlet nilを作るされています新しいiboutletがそこに作成されるように、あなたはmapVcの新しいインスタンスを作成しているからです。

テストケース

1. Dashboard -> MapVC, map will load. - because new instance of MapVC created on Dashboard 
2. MapVC -> Location List -> MapVC, map will not load. - because you are nil iboutlet in ViewDidDisappear so it is not longer for load. 
3. Dashboard -> MapVC -> Dashboard -> MapVC, map will always load. - because new instance of MapVC created on Dashboard always. 

あなたのViewControllerを割り当て解除するときに自動的に呼び出され、このメソッド

- (void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
} 

以下のように変更を加えます。

-(void)dealloc 
      { 
      [self.mapStoreView removeFromSuperview]; 
      self.mapStoreView = nil; 
      self.mapStoreView.mkMapView.delegate = nil; 
      [self.mapStoreView.mkMapView removeAnnotations:self.mapStoreView.mkMapView.annotations]; 
      self.results = nil; 
     } 
+0

だから、私はself.mapStoreView = viewWillDisappearにnil? – Alvin

+0

はい。すべてのmapStoreViewの関連行を削除する必要があります – KKRocks

+0

なぜあなたはviewDidDisappearで削除されましたか? – KKRocks

関連する問題