CFMutablePathRef可以自动释放吗?

时间:2011-08-11 20:59:19

标签: iphone quartz-graphics

我有一个类从类方法返回mutable pathRef:

    + (CGMutablePathRef)roundedRectanglePathInRectangle:(CGRect)rect withCornerRadius:(float)radius{

      CGMutablePathRef pathRef = CGPathCreateMutable();

      float x = rect.origin.x;
      float y = rect.origin.y;
      float w = rect.size.width;
      float h = rect.size.height;

      if (radius > w / 2) {
        radius = w / 2;
      }
      if (radius > h / 2) {
        radius = h / 2;
      }

      CGPoint tl = CGPointMake(x + radius, y + radius);
      CGPoint tr = CGPointMake(x + w -radius, y +radius);
      CGPoint br = CGPointMake(x + w -radius, y + h -radius);
      CGPoint bl = CGPointMake(x + radius, y + h -radius);


      CGPathMoveToPoint(pathRef, nil, x, tl.y);
      CGPathAddArc(pathRef, nil, tl.x, tl.y, radius, M_PI, 3*M_PI/2, 0);
      CGPathAddArc(pathRef, nil, tr.x, tr.y, radius, 3*M_PI/2, 0, 0);
      CGPathAddArc(pathRef, nil, br.x, br.y, radius, 0, M_PI/2, 0);
      CGPathAddArc(pathRef, nil, bl.x, bl.y, radius, M_PI/2, M_PI, 0); 

      CGPathAddLineToPoint(pathRef, nil, x, tl.y);



      return pathRef;
      CGPathRelease(pathRef);

    }

现在因为最后一行(发布)在(返回)之后,它永远不会被调用而且我有泄漏。有没有人有办法让这个CGPath自动释放?

非常感谢:)。

2 个答案:

答案 0 :(得分:2)

不,它不能。您可以从“CF”前缀告诉该类型属于Core Foundation,它没有与Foundation的autoRelease等效的内容。在某些情况下,基础类(如NSString)和Core Foundation类型(如CFStringRef)之间有免费的桥梁,可以让你解决这个问题,但CFPath及其可变对应物并没有免费桥接到任何基金会类。

调用方法后,您必须CFRelease您的可变路径。您应该根据内存管理约定来命名您的方法,这些约定表明调用者拥有返回的值,因此负责在完成后释放它。

答案 1 :(得分:0)

我相信你能做到:

return ((CGPathRef)[(__bridge id)somePathRef autorelease]);