Добавлен 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];
Затем позвольте слою, который вы добавили, получить право собственности на него. Когда вы освобождаете представление, которому принадлежит суперслой, ваш слой будет освобожден.
Я никогда не держал ссылки на слои, которые я создаю. Я позволю родительскому слою владеть им, и он прекрасно работает.