Добавлен CAGradientLayer, получаю это в моей сделке UIView: [выпуск CALayer]: сообщение отправлено на освобожденный экземпляр

Здесь,

У меня есть пользовательский UIView. Это представление действует как индикатор активности, но как метка над UIActivityIndicatorView. В init я добавляю CAGradientLayer. Я выделяю и инициализирую его и вставляю в индекс 0 как подслой свойства слоя UIView. При вызове метода 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

У кого-нибудь есть идеи. Поскольку я выделяю и инициализирую градиентный слой, я отвечаю за его освобождение. Я должен быть в состоянии выделить и инициализировать и назначить для некоторого ивара. Возможно, я должен создать собственность с удержанием на нем.

Спасибо,

1 ответ

Решение

Вы, вероятно, не должны выделять / инициализировать свой слой. Используйте удобный метод слоя:

    _gradientLayer = [[CAGradientLayer layer];

Затем позвольте слою, который вы добавили, получить право собственности на него. Когда вы освобождаете представление, которому принадлежит суперслой, ваш слой будет освобожден.

Я никогда не держал ссылки на слои, которые я создаю. Я позволю родительскому слою владеть им, и он прекрасно работает.

Другие вопросы по тегам