4

マップに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を使用してパスを解放する必要があることはわかっていますが、戻る必要があるときにどこで解放するか。

どちらも巨大なメモリをリークします。私はこれに何日も取り組んできました、助けてください。

前もって感謝します

4

3 に答える 3

8

メソッドの名前を に変更して-createPolyPath:、リリースする必要がある Core Foundation オブジェクトを返すことを明確にする必要があります。次に、 を呼び出すコードで、次の-createPolyPath:ようにリリースする必要があります。

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

「Core Foundation のメモリ管理プログラミング ガイド」を参照してください。

于 2010-11-13T11:30:52.567 に答える
1

newメソッドの名前を。のように変更する必要があると思いますnewPolyPath...。私はそれをします、そしてそれは私のために今うまくいきます、そしてそれ以上の道の漏れはありません...

またCGPathRelease(path);、パスを使用するたびに使用する必要があります。

于 2011-04-27T13:14:20.550 に答える
1

CGPathRelease(path); を使用してみてください。

例えば:

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

ここに素晴らしいヒントがあります:

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

于 2015-02-23T04:00:43.950 に答える