Objective c MKPolygonRenderer-严重的内存问题
在使用新的iOS7 MKPolygonRenderer类时,我当前面临一个硬内存问题。。我用一行代码指出了问题的根源:Objective c MKPolygonRenderer-严重的内存问题,objective-c,ios7,mapkit,mkoverlay,mkpolygon,Objective C,Ios7,Mapkit,Mkoverlay,Mkpolygon,在使用新的iOS7 MKPolygonRenderer类时,我当前面临一个硬内存问题。。我用一行代码指出了问题的根源: [renderer invalidatePath]; 核心框架似乎没有在这里释放内存,因此对该函数的后续调用会由于内存异常导致应用程序崩溃 基本上,我想做的是让用户改变地图上的单个多边形覆盖 @interface MapViewController () <MKMapViewDelegate> { MKPolygonRenderer* renderer;
[renderer invalidatePath];
核心框架似乎没有在这里释放内存,因此对该函数的后续调用会由于内存异常导致应用程序崩溃
基本上,我想做的是让用户改变地图上的单个多边形覆盖
@interface MapViewController () <MKMapViewDelegate>
{
MKPolygonRenderer* renderer;
}
@end
@implementation MapViewController
- (id) init
{
if ((self=[super init]) != nil)
{
MKMapView* viewMap = [[MKMapView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
viewMap.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
viewMap.delegate = self;
[self.view addSubview:viewMap];
viewMap.region = MKCoordinateRegionMake(CLLocationCoordinate2DMake(49.391759,8.675766), MKCoordinateSpanMake(0.35, 0.35));
// a simple polygon overlay with 4 points
CLLocationCoordinate2D overlayCoords[4] = { {49.421247,8.607101}, {49.418121,8.745117}, {49.321094,8.734818}, {49.320199,8.613968}/*, {49.370199,8.583968} */};
MKPolygon* overlay = [MKPolygon polygonWithCoordinates:overlayCoords count:4];
[viewMap addOverlay:overlay];
// the gesture recognizer which is used to alter the polygon
UILongPressGestureRecognizer* longPressRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress_recognized:)];
longPressRecognizer.minimumPressDuration = 0.1f;
[viewMap addGestureRecognizer:longPressRecognizer];
}
return self;
}
- (MKOverlayRenderer*)mapView:(MKMapView*)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
// reuse the renderer if already existent
if (self->renderer == nil)
{
NSLog(@" renderer is nil ==> creating");
renderer = [[MKPolygonRenderer alloc] initWithPolygon:overlay];
renderer.fillColor = [[UIColor darkGrayColor] colorWithAlphaComponent:0.4];
renderer.strokeColor = [UIColor greenColor];
renderer.lineWidth = 1;
}
else
NSLog(@" renderer is not nil ==> reusing");
return self->renderer;
}
- (void) longPress_recognized:(UILongPressGestureRecognizer*)sender
{
if (sender.state == UIGestureRecognizerStateBegan)
{
// begin drag
// check if and if yes, which polygon point is touched
// set indexOfSelectedPoint
}
else if (sender.state == UIGestureRecognizerStateChanged)
{
// drag move
if (indexOfSelectedMapPoint == -1)
return;
// get the coordinate of the user touch location
CLLocationCoordinate2D c = [self->viewMap convertPoint:[sender locationInView:self->viewMap] toCoordinateFromView:self->viewMap];
// update the coordinate of touched polygon point
self->renderer.polygon.points[indexOfSelectedMapPoint] = MKMapPointForCoordinate(c);
// this line causes the trouble
[renderer invalidatePath];
}
else if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled)
{
// drag end
// reset states
}
}
@接口MapViewController()
{
MKPolygonRenderer*渲染器;
}
@结束
@MapViewController的实现
-(id)init
{
if((self=[super init])!=nil)
{
MKMapView*viewMap=[[MKMapView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height)];
viewMap.autoresizingMask=uiviewsautoresizingflexiblewidth | uiviewsautoresizingflexiblewhight;
viewMap.delegate=self;
[self.view addSubview:viewMap];
viewMap.region=MKCoordinateRegionMake(CLLocationCoordinate2DMake(49.391759,8.675766),MKCoordinateSpanMake(0.35,0.35));
//具有4个点的简单多边形覆盖
CLLocationCoordination2d Overlycoords[4]={49.421247,8.607101}、{49.418121,8.745117}、{49.321094,8.734818}、{49.320199,8.613968}/*、{49.370199,8.583968}/};
MKPolygon*overlay=[MKPolygon polygon with coordinates:overlayCoords count:4];
[查看地图添加覆盖:覆盖];
//用于改变多边形的手势识别器
UILongPressGestureRecognizer*longPressRecognizer=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(LongPressu recognized:)];
longPressRecognizer.minimumPressDuration=0.1f;
[viewMap AddGestureRecognitor:LongPressRecognitor];
}
回归自我;
}
-(MKOverlayRenderer*)地图视图:(MKMapView*)地图视图渲染器ForOverlay:(id)overlay
{
//重用渲染器(如果已经存在)
如果(自->渲染器==nil)
{
NSLog(@“渲染器为nil==>creating”);
renderer=[[MKPolygonRenderer alloc]initWithPolygon:overlay];
renderer.fillColor=[[UIColor darkGrayColor]colorWithAlphaComponent:0.4];
renderer.strokeColor=[UIColor greenColor];
1.lineWidth=1;
}
其他的
NSLog(@“渲染器不是nil==>重用”);
返回自->渲染器;
}
-(无效)已识别长按:(UILongPressGestureRecognitor*)发送方
{
if(sender.state==UIgestureRecognitizerStateStart)
{
//开始拖动
//检查是否有,如果有,触摸的是哪个多边形点
//设置indexOfSelectedPoint
}
else if(sender.state==UIgestureRecognitizerStateChanged)
{
//拖动
如果(indexofselectedmagnate==-1)
返回;
//获取用户触摸位置的坐标
CLLocationCoordinate2D c=[self->viewMap convertPoint:[sender locationInView:self->viewMap]到CoordinateFromView:self->viewMap];
//更新接触多边形点的坐标
self->renderer.polygon.points[indexofselectedmagnment]=MKMapPointForCoordinate(c);
//这条线路引起了麻烦
[epath];
}
else if(sender.state==UIGestureRecognizerStateEnded | | sender.state==UIGestureRecognizerStateCancelled)
{
//拖尾
//重置状态
}
}
我的测试项目是使用ARC。探查器没有抱怨内存泄漏
有人有类似的问题吗?
我是不是做错了什么?
有更好的方法吗
提前谢谢你的帮助