gpt4 book ai didi

ios - CAShapeLayer 内存管理困境

转载 作者:行者123 更新时间:2023-11-29 03:20:50 24 4
gpt4 key购买 nike

我的 UIView 子类中有以下代码的三个变体。

局部变量

- (void)setupLayer {
CAShapeLayer *faucet = [CAShapeLayer layer];
faucet.strokeColor = [[UIColor blackColor] CGColor];
faucet.lineWidth = 1;
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint: CGPointMake(0, 0)];
[path addLineToPoint: CGPointMake(50, 0)];
[path addLineToPoint: CGPointMake(0, 50)];
[path closePath];
faucet.path = [path CGPath];
[self.layer addSublayer: faucet];
}

弱属性

@interface ValveStatusView : UIView
@property (weak, nonatomic) CAShapeLayer *faucet;
@end
@implementation ValveStatusView
- (void)setupLayer {
self.faucet = [CAShapeLayer layer];
self.faucet.strokeColor = [[UIColor blackColor] CGColor];
self.faucet.lineWidth = 1;
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint: CGPointMake(0, 0)];
[path addLineToPoint: CGPointMake(50, 0)];
[path addLineToPoint: CGPointMake(0, 50)];
[path closePath];
self.faucet.path = [path CGPath];
[self.layer addSublayer: self.faucet];
}

强大的属性

同上,除了:

    @property (strong, nonatomic) CAShapeLayer *faucet;

难题是这 3 个中的 2 个导致三角形出现。 局部变量 会,弱属性 不会,但强属性会。起初我只是玩弄属性,并得出结论 addSublayer: 必须是一个 weak 连接,所以我需要对它有 strong 引用.但如果是这样,那么为什么局部变量 版本有效。我很困惑。

(是的,我知道三角形不像水龙头)

最佳答案

您首先在创建属性时立即将 CAShapeLayer 分配给该属性。所以如果这个属性是弱的,那么它会立即被释放,因为它没有对它的强引用。您可以将它分配给方法中的局部变量,这将在方法中保持对它的强引用。然后,一旦您将它添加为子层,它就会在那里有一个强引用,并且您的属性在没有被释放的情况下可能很弱。

编辑:

进一步说明...因此,以下行:

self.faucet = [CAShapeLayer layer];

导致 CAShapeLayer 被创建,分配给弱属性,然后立即释放(因为它没有强引用)并导致弱属性被设置为 nil(因为那是多么弱指针工作)。它与以下行基本相同:

[CAShapeLayer layer];

您可以改为执行以下操作以保持属性较弱:

CAShapeLayer *faucet = [CAShapeLayer layer];
self.faucet = faucet;

局部变量在其仍在范围内时保持强引用。

关于ios - CAShapeLayer 内存管理困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21121045/

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