2013-04-12 8 views
5

Próbuję dodać CALayer jako podwarstwę w podklasie UIView, ale kiedy dodaję podwarstwę wewnątrz metody init otrzymuję EXC_BAD_ACCESS kiedy dodaję widok do innego widoku lub okna .Dodawanie podwarstwa CALayer wewnątrz UIView init

Init metoda:

- (id)initWithTitle:(NSString *)title message:(NSString *)message 
{ 
    if ((self = [super init])) 
    { 
     self.title = title; 
     self.message = message; 

     self.alertLayer = [[CALayer alloc] init]; 

     self.layer.cornerRadius = kCORNER_RADIUS; 
     self.layer.shadowRadius = 3.0; 
     self.layer.shadowColor = [UIColor blackColor].CGColor; 
     self.layer.shadowOffset = CGSizeMake(15, 20); 
     self.layer.shadowOpacity = 1.0; 

     self.alertLayer.delegate = self; 
     self.alertLayer.masksToBounds = YES; 
     self.alertLayer.cornerRadius = kCORNER_RADIUS; 

     [self.layer addSublayer:self.alertLayer]; // This line of code seems to cause EXC_BAD_ACCESS 
    } 

    return self; 
} 

EXC_BAD_ACCESS jest spowodowane po wywołaniu [self.view addSubview:alertView] wewnątrz kontrolera widoku lub UIWindow.

+0

Jakiego semantycznego zarządzania pamięcią używasz dla właściwości 'alertLayer'? – jlehr

Odpowiedz

9

Masz dwie warstwy (self.layer i self.alertLayer), które mają taki sam delegat self, prowadzi to do nieskończonej rekurencji w metodzie wewnętrznej -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] po dodaniu tego poglądu (self) do widoku drzewa. Dlatego musisz usunąć self.alertLayer.delegate = self;, aby uniknąć awarii. Jeśli potrzebujesz delegować na alarmLayer, możesz utworzyć odrębny obiekt.

+0

Dziękuję, nie wiedziałem, że UIView może mieć tylko jedną warstwę określającą ją jako delegata. – davey555