2013-04-12 21 views
5

Ich versuche, einen CALayer als Sublayer in einer UIView-Subklasse hinzuzufügen, aber wenn ich den Sublayer innerhalb der init-Methode hinzufüge, erhalte ich EXC_BAD_ACCESS, wenn ich die View einer anderen Ansicht oder einem anderen Fenster hinzufüge .Hinzufügen eines CALayer-Sublayers innerhalb von UIView init

Init Methode:

- (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 wird bewirkt, nachdem [self.view addSubview:alertView] in einem View-Controller oder UIWindow aufruft.

+0

Welche Speicherverwaltungssemantik verwenden Sie für die Eigenschaft 'alertLayer'? – jlehr

Antwort

9

Sie haben zwei Schichten (self.layer und self.alertLayer), welche die gleichen Delegierten self, führt dies zu einer Endlosschleife in internen Verfahren -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] wenn hinzugefügt, um diese Ansicht (self) zu der Ansicht Baum hat. Daher müssen Sie self.alertLayer.delegate = self; entfernen, um einen Absturz zu vermeiden. Wenn Sie für alarmLayer delegieren müssen, können Sie verschiedene Objekte erstellen.

+0

Vielen Dank, ich wusste nicht, dass ein UIView nur eine Schicht als Delegat haben kann. – davey555