Laxmikant W.
Laxmikant W.

Reputation: 33

MKMapView Memory issue in iOS 6.0 or later

Is IOS 6.0 takes more memory for MKMapview while zooming/dragging in IOS app, than MKMapview used in ios5.0 or 5.1?

It give me memory warning while zooming mkmapview in ios6.0

    - (MKAnnotationView *)mapView:(MKMapView *)mapView1 viewForAnnotation:(id <MKAnnotation> )annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
    {
        ((MKUserLocation *)annotation).title = kCurrentLocation;
        return nil;
    }
    
    if (annotation == self.calloutAnnotation)
    {
        CalloutMapAnnotationView *calloutMapAnnotationView=nil;
        
        if (calloutMapAnnotationView==nil){
            calloutMapAnnotationView = (CalloutMapAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"CalloutAnnotation"];
            calloutMapAnnotationView = [[CalloutMapAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"CalloutAnnotation"];
            
            UIImageView *calloutImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,285,109)];
            calloutImageView.image = [UIImage loadImageFromBundle:@"map-pop"];
            [calloutMapAnnotationView addSubview:calloutImageView];
            [calloutImageView bringSubviewToFront:calloutMapAnnotationView];
            
            CGRect frame1,btnframe,btnframe2;
            int font1;
            
            frame1 = CGRectMake(14,10,270,35);
            //frame for subitle label of map annotation view.
            btnframe = CGRectMake(12,53,80,25);
            btnframe2= CGRectMake(btnframe.size.width+20,btnframe.origin.y,btnframe.size.width+35, btnframe.size.height);
            font1 = 14.0;
            
            calloutMapAnnotationView.calloutTitleLabel=nil;
            calloutMapAnnotationView.calloutTitleLabel = [[UILabel alloc]initWithFrame:frame1];
            calloutMapAnnotationView.calloutTitleLabel.numberOfLines = 2;
            calloutMapAnnotationView.calloutTitleLabel.layer.cornerRadius=6;
            [calloutMapAnnotationView.calloutTitleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:font1]];
            [calloutMapAnnotationView.calloutTitleLabel setBackgroundColor:[UIColor clearColor]];
            [calloutMapAnnotationView.calloutTitleLabel setTextColor:[UIColor whiteColor]];
            
            calloutMapAnnotationView.infoButton = [UIButton buttonWithType:UIButtonTypeCustom];
            [calloutMapAnnotationView.infoButton setBackgroundImage:[UIImage loadImageFromBundle:@"blank-btn"] forState:UIControlStateNormal];
            [calloutMapAnnotationView.infoButton setTitle:kInfo forState:UIControlStateNormal];
            [[calloutMapAnnotationView.infoButton titleLabel ]setFont:[UIFont fontWithName:@"Helvetica-Bold" size:font1-1]];
            [calloutMapAnnotationView.infoButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            calloutMapAnnotationView.infoButton.frame = btnframe;
            calloutMapAnnotationView.infoButton.exclusiveTouch = YES;
            [calloutMapAnnotationView.infoButton addTarget:self action:@selector(buttonPressedAction:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchCancel];
            [calloutMapAnnotationView addSubview:calloutMapAnnotationView.infoButton];
            [calloutMapAnnotationView.infoButton bringSubviewToFront:calloutMapAnnotationView];
            [calloutMapAnnotationView addSubview:calloutMapAnnotationView.calloutTitleLabel];
            //            infoButton=nil;
            
            calloutMapAnnotationView.routeButton = [UIButton buttonWithType:UIButtonTypeCustom];//inDark
            [calloutMapAnnotationView.routeButton setBackgroundImage:[UIImage loadImageFromBundle:@"blank-btn"] forState:UIControlStateNormal];
            calloutMapAnnotationView.routeButton.frame = btnframe2;
            [calloutMapAnnotationView.routeButton setTitle:kRouteDraw forState:UIControlStateNormal];
            [[calloutMapAnnotationView.routeButton titleLabel ]setFont:[UIFont fontWithName:@"Helvetica-Bold" size:font1-1]];
            [calloutMapAnnotationView.routeButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
            calloutMapAnnotationView.routeButton.exclusiveTouch = YES;
            calloutMapAnnotationView.routeButton.tag = well_ID;
            [calloutMapAnnotationView.routeButton addTarget:self action:@selector(showRouteView:) forControlEvents:UIControlEventTouchUpInside | UIControlEventTouchCancel];
            [calloutMapAnnotationView addSubview:calloutMapAnnotationView.routeButton];
            
        }
        
        calloutMapAnnotationView.calloutTitleLabel.text = self.titleStr;
        
        NSLog(@"well id---%d",well_ID);
        calloutMapAnnotationView.infoButton.tag = well_ID;
        
        int locationId=[[resultDict objectForKey:@"uid"] intValue];
        
        if(well_ID!=locationId)
        {
            calloutMapAnnotationView.routeButton.hidden = NO;
            calloutMapAnnotationView.routeButton.tag = well_ID;
            [calloutMapAnnotationView.routeButton bringSubviewToFront:calloutMapAnnotationView];
        }else{
            calloutMapAnnotationView.routeButton.hidden = YES;
        }
        calloutMapAnnotationView.parentAnnotationView = self.selectedAnnotationView;
        calloutMapAnnotationView.mapView = mapView;
        
        return calloutMapAnnotationView;
    } else {
        static NSString *defaultPinID = @"Pin";
        MKAnnotationView* pin = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier: defaultPinID];
        int annotationValue =[annotation_array indexOfObject:annotation];
        NSString * searchLocationTitle= [annotation title];
        if ( pin == nil ) {
            pin = (MKAnnotationView*) [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier: defaultPinID];
            pin.image = [UIImage loadImageFromBundle:@"logo"];
        }
        pin.canShowCallout = NO;
        if (annotationValue!=0) {
            if([searchLocationTitle isEqualToString:kCurrentLocation])
            {
                pin.image=nil;
                
            }
            else if([searchLocationTitle isEqualToString:kSearchedLocation])
            {
                pin.image=nil;
                
            }
            else
            {
                if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
                    pin.frame = CGRectMake(-15, 0, 40,65);
                } else
                {
                    pin.frame = CGRectMake(-15, 0, 45,70);
                }
            }
        }
        else{
            return nil;
        }
        return pin;
    }
    return nil;
}

Above code for viewForannotation delegate method of mkmapView.

Upvotes: 1

Views: 1900

Answers (2)

user3603663
user3603663

Reputation: 1

I have identified that memory leaks when it occurred , when ever you have set MKmapview type is hybrid. That type of memory leaks occurred.

My advice is simply select satellite

Upvotes: 0

Daij-Djan
Daij-Djan

Reputation: 50089

since 6+ map views use vector kit, in 4/5 it uses google maps

I must tell you that the MKMapView in ios6+ is really really bad. we spent WEEKS getting it to consume less memory but the new vector kit uses memory like crazy :/

show the whole world -- boom 50mb, show cupertino + 30, go to la + 30 go to washington DC + 30 or so...

nothing todo.. oh there's things you can try to make it better but uulimately the problem remains. The map view is unmanageable and we switched to the google maps sdk.


things we did before we switched (that helped):

  • we shared one map view across multiple screens. We had a MKMapViewWrapperView that helped a lot because a map view actually 'leaks' when it is deallocated, so we always kept it around

  • we sometimes toggled the mapType... that *it sounds weird) causes the map view to free some of its memory

Upvotes: 5

Related Questions