Огромная утечка памяти в CGMutablePathRef - PullRequest
4 голосов
/ 13 ноября 2010

Я сделал около 1000 полигонов на карте.Я получаю путь многоугольника, используя

-   (CGPathRef)polyPath:(MKPolygon *)polygon
{
     MKMapPoint *points = [polygon points];
     NSUInteger pointCount = [polygon pointCount];
     NSUInteger i;
     if (pointCount < 3)
         return NULL;
     CGMutablePathRef path = CGPathCreateMutable();
     if([polygon isKindOfClass:[MKPolygon class]])
     {
            for (MKPolygon *interiorPolygon in polygon.interiorPolygons)
      {
       CGPathRef interiorPath = [self polyPath:interiorPolygon];
       CGPathAddPath(path, NULL, interiorPath);
       CGPathRelease(interiorPath);
       }
  }
     CGPoint relativePoint = [self pointForMapPoint:points[0]];
     CGPathMoveToPoint(path, NULL, relativePoint.x, relativePoint.y);
     for (i = 1; i < pointCount; i++) 
     {
            relativePoint = [self pointForMapPoint:points[i]];
            CGPathAddLineToPoint(path, NULL, relativePoint.x, relativePoint.y);
     }
     return path;
}

- (void)drawMapRect:(MKMapRect)mapRect
      zoomScale:(MKZoomScale)zoomScale
      inContext:(CGContextRef)context
{
    MultiPolygon *multiPolygon = (MultiPolygon *)self.overlay;
for (MKPolygon *polygon in multiPolygon.polygons) 
{
    if([polygon isKindOfClass:[MKPolygon class]])
    {
            CGPathRef path = [self polyPath:polygon];
            if (path) 
            {
                [self applyFillPropertiesToContext:context atZoomScale:zoomScale];
                CGContextBeginPath(context);
                CGContextAddPath(context, path);
                CGContextDrawPath(context, kCGPathEOFill);
                [self applyStrokePropertiesToContext:context atZoomScale:zoomScale];
                CGContextBeginPath(context);
                CGContextAddPath(context, path);
                CGContextSetAlpha(context,1.0);
                CGContextStrokePath(context);
            }
            CGPathRelease(path);
    }
}
}

Я получаю утечку в

CGPathRelease(interiorPath);

и

return path;

Я знаю, что мне нужно освободить путь, используя CGPathReleaseно куда его выпустить, пока я должен вернуться.

Оба утечки огромной памяти.Я работал над этим в течение нескольких дней, пожалуйста, помогите.

Заранее спасибо

Ответы [ 3 ]

7 голосов
/ 13 ноября 2010

Вы должны переименовать ваш метод в -createPolyPath:, чтобы было ясно, что он возвращает объект Core Foundation, который должен быть освобожден, а затем в коде, в котором вы вызываете -createPolyPath:, вам нужно освободить его так :

CGPathRef path = [someObjectOrClass createPolyPath:somePolygon];
// Do some stuff with the path
CGPathRelease(path);

См. «Руководство по программированию управления памятью для Core Foundation» :

1 голос
/ 23 февраля 2015

Попробуйте использовать CGPathRelease (путь);

Например:

CGMutablePathRef path = CGPathCreateMutable(); // created memory allocation
CGPathCloseSubpath(path);
CGPathRelease(path); // released path allocation

Здесь найден отличный совет:

http://the.ichibod.com/kiji/ios-memory-management-tips/

1 голос
/ 27 апреля 2011

Я думаю, что вы должны переименовать свой метод, начиная с new как newPolyPath.... Я сделал это, и теперь это работа для меня без утечек на пути ...

Вы также должны использовать CGPathRelease(path); после каждого использования вашего пути.

...