mkmapview图像叠加缩放ios中的内存问题

时间:2014-09-10 05:30:25

标签: ios objective-c iphone xcode

当我添加imageOverlay高分辨率图像时,地图缩放图像在地图中消失并导致内存问题。有时我的应用程序崩溃了。怎么解决这个问题?

这是我的代码

-(void)addOverlay
 {
    MapOverlay *overlay = [[MapOverlay alloc] initWithRouteOverlay:self.routeOverlayObj];
    [self.mapView addOverlay:overlay];
 } 
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
 {
if([overlay isKindOfClass:[MapOverlay class]])
{
   mapOverlay = (MapOverlay *)overlay;
    NSLog(@"%@ %@",routeInfoObj.routeOverlay,[UIImage imageNamed:routeInfoObj.routeOverlay]);
    ATTMapOverLayRender *mapOverlayRender = [[ATTMapOverLayRender alloc] initWithOverlay:mapOverlay overlayImage:[UIImage imageNamed:routeInfoObj.routeOverlay] andImageFile:[NSString stringWithFormat:@"%@.png",routeInfoObj.routeOverlay]];

    return mapOverlayRender;
}
else
{


    MKPolylineRenderer *routeRenderer = [[MKPolylineRenderer alloc] initWithPolyline:routePolyline];
    routeRenderer.strokeColor = [UIColor redColor];
    routeRenderer.fillColor = [UIColor redColor];
    routeRenderer.lineWidth = 5;
    return routeRenderer;

}
return nil;
 }

和“ATTMApOVerlayRender.h”

@interface ATTMapOverLayRender : MKOverlayRenderer
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage   andImageFile:(NSString *)file;
@property (nonatomic, weak) UIImage *overlayImage;
@end

“ATTMApOVerlayRender.h”

#import "ATTMapOverLayRender.h"

@implementation ATTMapOverLayRender
- (instancetype)initWithOverlay:(id<MKOverlay>)overlay overlayImage:(UIImage *)overlayImage    andImageFile:(NSString *)file {
self = [super initWithOverlay:overlay];
if (self) {
    self.overlayImage = overlayImage;

}

return self;
  }
 - (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context {


 CGImageRef image = _overlayImage.CGImage;
MKMapRect overlayMapRect = [self.overlay boundingMapRect];
CGRect overlayRect = [self rectForMapRect:overlayMapRect];

// draw image
CGContextScaleCTM(context, 1.0, -1.0);
CGContextTranslateCTM(context, 0.0, -overlayRect.size.height);
CGContextDrawImage(context, overlayRect, image);

}
 @end

1 个答案:

答案 0 :(得分:0)

我也在瓷砖覆盖项目中遇到类似的问题。 通过维护单个MKMapOverlayRenderer,我能够显着提高内存使用率。

每次调用MKOverlayRenderer方法时,不是为新的MKPolylineRenderer(或mapView: renderForOverlay:)分配内存,而是创建一个类变量并重写它。

因此,在ViewController.h或包含调用-(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)叠加层的mapView的任何类中,

@property (nonatomic, strong) MKOverlayRenderer *renderer;

-(MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)overlay

的声明中

使用

self.renderer = [[MKOverlayRenderer alloc] init...