正确的方法来释放CGMutablePathRef对象

时间:2015-07-22 05:17:55

标签: ios objective-c core-graphics

@property (nonatomic, assign) CGMutablePathRef path;

我试过了

self.path = CGPathCreateMutable();
CGPathAddEllipseInRect(self.path, nil, elipseRect);
CGPathAddRect(self.path, nil, view.bounds);

CAShapeLayer *layer = [CAShapeLayer layer];
layer.path = self.path;
layer.fillRule = kCAFillRuleEvenOdd;
view.layer.mask = layer;
[self setupButton];

CGPathCloseSubpath(self.path);

    . . .

    . . .

CGPathRelease(self.path);

在分析

时,释放路径会显示以下错误

调用者此时不拥有的对象的引用计数的不正确减少。

1 个答案:

答案 0 :(得分:2)

如果这段代码都是如你所示的简单序列,为什么你使用属性(self.path)作为路径,而不只是局部变量?而且,制作任何可变类型的属性都是一个非常糟糕的主意。调用者可以获得可变引用,然后在不进一步调用类的方法的情况下对其进行修改,这会使您的类无法更改为自己的状态。

如果你真的需要一个房产,你可能应该像苹果那样做。虽然该属性已声明(或默认为)assign,但请记录它实际上很强大。自己实现setter以提供强大的语义(保留新值,释放旧值)。另外,不要忘记覆盖-dealloc并在那里释放实例变量。

例如,请参见path的{​​{1}}属性。它的类型为MKOverlayPathRenderer,这意味着它默认为CGPathRef,并且无法声明为assignstrong,但它被记录为实际存在强。

如果你这样做,你必须小心分配。您需要使用本地并在分配给属性后释放它,或者您需要使用retain(鲜为人知,但会做您期望的事情)。所以,要么:

CFAutorelease()

或者:

CGMutablePathRef path = CGPathCreateMutable();
self.path = path;
CGPathRelease(path);