1

現在、新しい iOS7 MKPolygonRenderer クラスを使用しているときにハード メモリの問題に直面しています。問題の原因を 1 行のコードに突き止めました。

[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
    }
}

私のテスト プロジェクトは ARC を使用しています。プロファイラーは、メモリ リークについて不平を言っているわけではありません。

誰かが同様の問題を抱えていますか?私はここで何か完全に間違っていますか?これを行うより良い方法はありますか?

事前に助けてくれてありがとう

4

0 に答える 0