私のアプリでは、私は位置情報をダウンロードして地図上に表示しています。なぜ起こっているのか理解できないシナリオがいくつかあります。時々、私の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