如果在初始化程序中创建,则会立即释放对象,但如果在方法中创建则不会

And*_*nko 0 memory-management objective-c ios

我有以下课程:

@implementation MyUICollectionViewCell {
    CAShapeLayer *layr;
}


- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.layer.mask = [CAShapeLayer layer];
        layr = [CAShapeLayer layer];
    }
    return self;
}

- (void)initMask {
    self.layer.mask = [CAShapeLayer layer];
}

- (void)updateMask {   
    CAShapeLayer *maskLayer = (CAShapeLayer*) self.layer.mask;
    maskLayer.frame = ...;
    maskLayer.path = ...;
}

@end
Run Code Online (Sandbox Code Playgroud)

如果我self.layer.mask在构造函数中赋值,则它nilupdateMask方法中.但是,如果赋值是在initMask方法中完成的(从类外部调用),一切正常.

谁能解释一下这里发生了什么?


编辑: 尝试将对象存储在ivar(即layr)中,但无济于事 - 它仍然nil存在updateMask.

Pai*_*ack 5

我认为在调用initWithFrame时尚未启动图层内容.这将导致覆盖您稍后在初始化期间设置的图层信息.

我前段时间使用的是layoutSubViews的覆盖.在您的情况下,这将类似于以下内容:

-(void)layoutSubViews
{
    [super layoutSubviews];  // Added due to remark below

    self.layer.mask = [CAShapeLayer layer];
}
Run Code Online (Sandbox Code Playgroud)

我希望这会给你一个替代方案.