Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c MKPolygonRenderer-严重的内存问题_Objective C_Ios7_Mapkit_Mkoverlay_Mkpolygon - Fatal编程技术网

Objective c 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;

在使用新的iOS7 MKPolygonRenderer类时,我当前面临一个硬内存问题。。我用一行代码指出了问题的根源:

[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。探查器没有抱怨内存泄漏

有人有类似的问题吗? 我是不是做错了什么? 有更好的方法吗

提前谢谢你的帮助