我有一个类从类方法返回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自动释放?
非常感谢:)。
答案 0 :(得分:2)
不,它不能。您可以从“CF”前缀告诉该类型属于Core Foundation,它没有与Foundation的autoRelease等效的内容。在某些情况下,基础类(如NSString)和Core Foundation类型(如CFStringRef)之间有免费的桥梁,可以让你解决这个问题,但CFPath及其可变对应物并没有免费桥接到任何基金会类。
调用方法后,您必须CFRelease您的可变路径。您应该根据内存管理约定来命名您的方法,这些约定表明调用者拥有返回的值,因此负责在完成后释放它。
答案 1 :(得分:0)
我相信你能做到:
return ((CGPathRef)[(__bridge id)somePathRef autorelease]);