添加了 CAGradientLayer,在我的 UIView dealloc 中得到了这个:[CALayer release]: message sent to deallocated instanc

Posted

技术标签:

【中文标题】添加了 CAGradientLayer,在我的 UIView dealloc 中得到了这个:[CALayer release]: message sent to deallocated instance【英文标题】:Added CAGradientLayer, getting this in my UIView dealloc: [CALayer release]: message sent to deallocated instance 【发布时间】:2012-09-08 18:47:37 【问题描述】:

这里,

我有一个自定义 UIView。此视图充当活动指示器,但作为 UIActivityIndi​​catorView 上方的标签。在初始化中,我添加了一个 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。也许我应该创建一个带有保留的属性。

谢谢,

【问题讨论】:

您必须有其他涉及您尚未发布的图层的代码。您是否尝试过使用静态分析器? 事实证明,我释放的另一个对象有问题。标签活动视图运行良好。 【参考方案1】:

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

    _gradientLayer = [[CAGradientLayer layer];

然后让您添加它的层获得它的所有权。当你释放superlayer所属的view时,你的layer就会被释放。

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

【讨论】:

酷,我不知道。现在我知道。谢谢。

以上是关于添加了 CAGradientLayer,在我的 UIView dealloc 中得到了这个:[CALayer release]: message sent to deallocated instanc的主要内容,如果未能解决你的问题,请参考以下文章

如何将 CAGradientLayer 添加到 CAShapeLayer?

使用 CAGradientLayer 和 drawRect:(CGRect) 绘制顺序

防止 CAGradientLayer 在 UITableViewCell 上的 UIImageView 内重叠

CAGradientLayer不显示

如何添加完全填充视图框架的渐变层

带有 CAShapeLayer 的 UIView 不显示 CAGradientLayer