При назначении делегата на подуровень CALayer возникает ошибка EXC_BAD_ACCESS?

Я пытаюсь использовать серию CALayer в качестве подслоев для представления, которое требует немного более мелкозернистой прорисовки, чем обычно. Я использовал CATiledLayerраньше и думал, что использование подслоев будет проще, если не столь же привередливым. Я решил, что выполняю [self.layer addSublayer:sublayer], устанавливаю делегата этого нового подслоя, а затем рисую все, что хочу, в методе drawLayer:inContext:. Но, к моему большому удивлению,мое приложение падает на addSubview:(без IB) или где-то выше в стеке вызовов (при использовании IB).

Согласно документам...

Ссылка CALayer , похоже, точно определяет, что я делаю, но каждый раз происходит сбой:

В iOS, если слой связан с объект UIView, это свойство должно быть установлено на представление, которому принадлежит слой.

Но очевидно, что я что-то напортачил. К счастью, это легко воспроизводимо. Можете ли вы объяснить мне, как я должен использовать подслои с назначениями делегатов, чтобы получать правильные вызовы drawLayer:inContext:без сбоев?

Шаги для воспроизведения

Поместите это в класс пользовательского представления, отображаемого на экране с помощью Interface Builder (или перепишите инициализацию, чтобы она называлась initWithFrame:):

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];

    if (self) {
        CALayer *sublayer = [CALayer layer];
        sublayer.frame = self.layer.bounds;

        // Disable or enable this next line to 
        // resolve or trigger an EXC_BAD_ACCESS crash.
        // 
        sublayer.delegate = self;

        [self.layer addSublayer:sublayer];
        [self.layer setNeedsDisplay];
    }

    return self;
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    CGContextSetFillColorWithColor(ctx, [[UIColor greenColor] CGColor]);
    CGContextFillRect(ctx, self.bounds);
}

Если вы запустите этот код , ваше приложение выйдет из строя. Обратите внимание на подуровень .делегат = строка self. Если вы отключите его, ваше приложение будет работать, но метод drawLayer:inContext:никогда не будет вызываться для этого подслоя.

Что я делаю не так?

7
задан epologee 21 February 2012 в 22:39
поделиться