我在我的UIView
子类中有以下代码的三种变体。CAShapeLayer内存管理窘境
局部变量
- (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
引用它。但是,如果是这种情况,那么为什么本地变量版本工作。我很困惑。
(是的,我知道一个三角形是没有太大的龙头)的
有道理。我做了一个错误的假设,即该方法的范围会使它保持活跃,但那是因为我试图将该属性视为局部变量太多。理解“弱”属性的有用经验。 –
这是弱财产的危险。如果只有编译器足够聪明才能警告这种情况。但至少在大多数情况下,显然有些事情是错误的。 – Gavin