2016-09-07 15 views
0

私のアプリでは、私は位置情報をダウンロードして地図上に表示しています。なぜ起こっているのか理解できないシナリオがいくつかあります。時々、私のmapView(Googleマップ)クラスdeallocが呼び出されていて、マップ上にマーカーが表示されない(私の現在の位置はまだわかります)。deallocプロセスの観察方法

これは私のMapViewは、ストーリーボードに設定されているか:

[ContainerVc] -embedSegue->[MapView] 

コンテナVcは、ルートVcのです。

と私のrootVcクラスで

@property (weak, nonatomic) MapVc *mapVc; 

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 
    if ([[segue identifier] isEqualToString: @"embeddedMapVc"]) { 
     self.mapVc = [segue destinationViewController]; 
     self.mapVc.delegate = self; 
    } 
    } 

と私のmapVCクラスの(すべてのプロパティは、強い非アトミックです):

-(void)viewDidAppear:(BOOL)animated{ 
     [super viewDidAppear:animated]; 
     [self setupMapView]; 
    } 

- (void)setupMapView{ 

    MyLog(@"Map view just refreshed/setup"); 
    //set map view 
    self.infoWindow = [[MyMapInfoWindow alloc] initWithFrame:CGRectMake(0, 0, 210, 47)]; 
    self.infoWindow.delegate = self; 


    CLLocation *center = [[MyLocationMonitor sharedInstance] getLocation]; 

    GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:center.coordinate.latitude longitude:center.coordinate.longitude zoom:18]; 

    self.mapView = [GMSMapView mapWithFrame:CGRectZero camera:camera]; 
    self.mapView.camera=camera; 
    [self.mapView setMapType:kGMSTypeNormal]; 
    [self.mapView setMinZoom:14 maxZoom:18]; 
    [self.mapView setDelegate:self]; 
    self.mapView.myLocationEnabled=YES; 
    self.mapView.settings.rotateGestures = NO; 
    self.mapView.settings.myLocationButton = YES; 
    [self.mapView setPadding:UIEdgeInsetsMake(0, 0, 62, 0)]; 

    self.view = self.mapView; 
    [self setupMarkers]; 

} 

- (void)setupMarkers{ 
MyLog(@"setting up markers"); 
self.annotations = nil; 
[self.mapView clear]; 

[[MyLocationMonitor sharedInstance] getBuildingsWithCompletion:^(BOOL success, NSArray *buildings) { 
    self.buildings = buildings; 
    MyLog(@"_buildings_: %@", self.buildings); 
    if (success) { 

     GMSCoordinateBounds *bounds = [[GMSCoordinateBounds alloc] init]; 

     self.annotations = [[NSMutableArray alloc] init]; 

     for (NSDictionary *location in buildings) { 

      CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake([[location objectForKey:@"Latitude"] doubleValue], [[location objectForKey:@"Longitude"] doubleValue]); 

      bounds = [bounds includingCoordinate:coordinate]; 

      GMSMarker *marker = [GMSMarker markerWithPosition:coordinate]; 
      marker.title = [location objectForKey:@"name"]; 
      marker.map = self.mapView; 
      marker.icon = [UIImage imageNamed:@"Boost-BuildingMarkerIcon"]; 
      marker.userData = @{@"building":location}; 
      marker.infoWindowAnchor = CGPointMake(1.0f, -0.1f); 
      marker.opacity = 1.0; 

      [self.annotations addObject:marker]; 
     } 
     [self.mapView animateWithCameraUpdate:[GMSCameraUpdate fitBounds:bounds withPadding:50.0]]; 

    } 

}]; 
} 

-(void)dealloc{ 
    MyLog(@"MApVC dealloc called"); 
} 

だから、rootVcから、私は別のコントローラに移動し、私はネットワークコールを終了した後、私はprepareForSegueがトリガーされ、callがmapVcクラスに行き、mapViewを設定します(このプロセスでは、mapVc deallocはそのような場合に呼び出されますが、私はマーカーを見ることができません地図にある)。

私は、スタックトレースから多くの情報を得ることができませんでした。なぜ私のmapVcが時々割り当て解除されるのか知りたいのですが?私のmapVcがいつでも割り当て解除されないようにするには?

編集:私のmapVcはいつでも割り当てが解除されていないことを確認する方法

<MapVc: 0x7ff83f2883c0> On didAppear 

<MapVc: 0x7ff83f2883c0> on dealloc (why is this happening ?) 

<MapVc: 0x7ff84475b6f0> new instance again on viewDidAppear 

答えて

1

私はdeallocをケース内mapVc自己をログに記録しましたか?

VCが画面上にない(または少なくともナビゲーションスタック内にある)ときに必要な場合は、MVCが壊れています。私はここでそれが起こっているとは思っていませんが、心に留めておくことが重要です。ネットワーク操作はモデルレイヤーで実行され、ビューレイヤーはモデルを観察する必要があります。 View Controllerは、ネットワーク操作ではなく、現在表示されているビューを管理します。 View Controllerを正しく構成していない可能性があります。

つまり、おそらくこの場合は実際の問題ではありません。問題は、何も保持していないということです。mapVcルートビューコントローラにはweakだから、segueが完了するとすぐにリリースされるでしょう(segueは実行中にsegueを保持します)。 mapVcがルートビューコントローラに組み込まれている場合は、ほぼ確実にstrongになります。

関連する問題