添加了CAGradientLayer,在我的UIView dealloc:[CLAyer release]中获取此消息:



这里,

我有一个自定义的UIView。此视图充当活动指示器,但作为UIActivityIndicatorView上方的标签。在init中,我添加了一个CAGradientLayer。我分配并初始化它,并将它作为UIView层属性的子层插入索引0。在我的dealloc方法被调用时,我在控制台中收到一条消息:

- [CALayer release]: message sent to deallocated instance.

我的代码:

@interface LabelActivityIndicatorView ()
{
    UILabel *_label;
    UIActivityIndicatorView *_activityIndicatorView;
    CAGradientLayer *_gradientLayer;
}
@end
@implementation LabelActivityIndicatorView
//dealloc
- (void) dealloc
{
    [_label release];
    [_activityIndicatorView release];
    //even tried to remove the layer
    [_gradientLayer removeFromSuperLayer];
    [_gradientLayer release];
    [super dealloc];
}
// init
- (id) initWithFrame:(CGRect)frame
{
    if ( (self = [super initWithFrame:frame]) )
    {
        // init the label
        // init the gradient layer
        _gradientLayer = [[CAGradientLayer alloc] init];
        [_gradientLayer setBounds:[self bounds]];
        [_gradientLayer setPosition:CGPointMake(frame.size.width/2, frame.size.height/2)];
        [[self layer] insertSublayer:_gradientLayer atIndex:0];
        [[self layer] setNeedsDisplay];
    }
    return self;
}
@end

任何人都有任何想法。由于我正在分配和初始化梯度层,我负责释放它。我应该能够分配和初始化并分配给一些ivar。也许我应该创建一个保留的财产。

谢谢,

您可能不应该分配/初始化您的层。使用方便的方法层:

    _gradientLayer = [[CAGradientLayer layer];

然后让你添加的层拥有它的所有权。当你释放超级层所属的视图时,你的层就会被释放。

我从未保留过对我创建的层的所有权引用。我让父层拥有它,它工作得很好。

最新更新