CALayer addublayer не добавляет подслой - PullRequest
1 голос
/ 01 марта 2011

Я столкнулся с самой странной из проблем: иногда добавление подслоя в CALayer не работает ([layer addSublayer:child]), то есть счетчик подслоя остается равным 0 и ничто не отображается на экране.

Иногда это работает , и дочерний слой появляется на экране, как я и ожидал.Когда это не так, обычно выполнение чистой сборки исправляет это, но не всегда.Я также экспериментировал с запуском двух экземпляров моего приложения из Терминала, обычно второй экземпляр показывает проблемное поведение.

Вот (сокращенно) код:

   NSLog(@"Retain count before: %d", [childLayer retainCount]);
   // [parentLayer insertSublayer:childLayer atIndex:0]; // same problem here
   [parentLayer childLayer];
   NSLog(@"Retain count after: %d layer: %@", [childLayer retainCount], childLayer);
   NSLog(@"Sublayercount: %d", [[parentLayer sublayers] count]);

Дочерний уровеньбазовый слой с фоном, установленным на цвет RGB.

Вывод отладки:

layer: <CALayer: 0x1982b0> X: 50.00 Y: -90.00 width: 200.00 height: 200.00
Retain count before: 2
Retain count after: 2 layer: <CALayer: 0x1982b0>
Sublayercount: 0

Когда это работает, вышеприведенный вывод показывает, что счетчик хранения правильно увеличивается до 3 иподуровень к 1.

Есть ли что-то особенное в CALayers?addSublayer полагается на что-то еще / выполняет проверки достоверности подслоя?

Кто-нибудь может предложить способ отладки этого?Есть ли способ, как я могу войти в addSublayer с помощью отладчика?

Спасибо!Марк.

Ответы [ 2 ]

2 голосов
/ 01 марта 2011

retainCount бесполезен;не называйте это ....

Рад, что вы поняли проблему.

2 голосов
/ 01 марта 2011

Я наконец понял это. Иногда это помогает просто поговорить (ну, опубликовать) о проблеме.

Оказалось, проблема с тем, как я инициализировал пользовательское представление, содержащее слои. Между вызовами awakeFromNib к контроллеру приложения и представлением возникло состояние гонки. Контроллер приложения будет загружать пользовательские слои, но иногда пользовательское представление еще не инициализируется.

Решением было перенести код инициализации для представления в контроллере приложения с awakeFromNib на appliationDidFinishLaunching.

...