【问题标题】:Proper way to release CGMutablePathRef Object释放 CGMutablePathRef 对象的正确方法
【发布时间】:2015-07-22 05:17:54
【问题描述】:
@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);

解析时释放路径显示如下错误

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

【问题讨论】:

    标签: ios objective-c core-graphics


    【解决方案1】:

    如果这段代码都像您展示的那样按照简单的顺序排列,为什么您要使用属性 (self.path) 作为路径,而不仅仅是局部变量?此外,将任何属性设为可变类型是一个非常糟糕的主意。调用者可以获取可变引用,然后在不进一步调用您的类的方法的情况下对其进行变异,这会使您的类对其自身状态的更改视而不见。

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

    例如,参见MKOverlayPathRendererpath 属性。它的类型为CGPathRef,这意味着它默认为assign,不能声明为strongretain,但它被记录为实际上很强大。

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

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

    或者:

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

    【讨论】:

    • 感谢您抽出宝贵时间帮助我并做出解释。这就像魅力一样。这只是解释我的问题的示例代码。再次感谢。
    猜你喜欢
    • 2013-03-21
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多