gpt4 book ai didi

ios - 释放 CGMutablePathRef 对象的正确方法

转载 作者:行者123 更新时间:2023-11-29 10:27:13 26 4
gpt4 key购买 nike

@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);

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

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

最佳答案

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

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

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

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

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

或者:

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

关于ios - 释放 CGMutablePathRef 对象的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com