Дайте угадаю - вы не используете ARC в своем проекте?
Я испробовал несколько подходов, чтобы воспроизвести ваше заявление об утечке, но пока не могу найти способ, чтобы это произошло.
Я добавил тег в ваш класс:
@interface TestLayer: CALayer
@property (nonatomic, assign) int tag;
@end
@implementation TestLayer
-(void)dealloc
{
NSLog(@"dealloc called for %d", self.tag);
}
@end
Сначала я попробовал ваш код AppDelegate, в том же месте:
for (int i=0; i<10; i++) {
@autoreleasepool {
TestLayer* test = [TestLayer layer];
test.tag = 100;
CALayer* l = [CALayer layer];
[test addSublayer:l];
[l removeFromSuperlayer];
l = nil;
test = nil;
}
}
Он печатает dealloc
каждый раз!
Затем в моем первом контроллере представления я немного изменил его:
- (void)viewDidLoad {
[super viewDidLoad];
tl = [TestLayer layer]; // its an ivar
tl.tag = 100;
for (int i=0; i<10; i++) {
@autoreleasepool {
TestLayer *l = [TestLayer layer];
l.tag = i + 10;
[tl addSublayer:l];
[tl removeFromSuperlayer]; // tried this, also tried commenting it out
}
}
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
NSArray *sl = [self->tl.sublayers copy];
for (TestLayer *l in sl) {
[l removeFromSuperlayer];
}
self->tl = nil;
});
}
Единственный вывод, который я могу сделать, это то, что вы не используете ARC, о чем вы должны были упомянуть.
PS: если не использовать ARC, я могу только предположить, что CALayer layer
возвращает объект с сохраняемым счетчиком 1, и он не освобождается автоматически. Если это так, вам нужно явно отправить ему сообщение release
.