Во-первых, testLayer был выпущен в -viewDidLoad. При повторном доступе к нему в -touchesBegan он недействителен. Этот слой, на который он ссылается, все еще существует, но он сохраняется только в массиве подслоев. Вы можете изменить код для создания автоматически выпущенного CALayer, например так:
- (void)viewDidLoad {
testLayer = [CALayer layer];
testLayer.bounds = CGRectMake(0, 0, 100, 100);
testLayer.position = CGPointMake(400, 400);
[testLayer setBackgroundColor:[UIColor redColor].CGColor];
testLayer.delegate = self;
[self.view.layer addSublayer:testLayer];
}
Теперь он фактически будет удален из иерархии слоев в -touchesBegan. Имейте в виду, что он также будет выпущен в -touchesBegan, потому что ничто больше не содержит ссылки на него. Вам нужно будет повторно инициализировать его или сохранить самостоятельно, прежде чем вызывать -removeFromSuperlayer.