2013-04-12 39 views
5

我試圖添加一個CALayer作爲UIView子類中的子層,但是當我在init方法中添加子層時,我將EXC_BAD_ACCESS添加到另一個視圖或窗口中。在UIView中添加一個CALayer子圖層初始化

Init方法:

- (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正在呼叫[self.view addSubview:alertView]視圖控制器或一個UIWindow內部之後引起的。

+0

你爲alertLayer屬性使用了什麼內存管理語義? – jlehr

回答

9

您有兩層(self.layerself.alertLayer),它們具有相同的委託self,當加入該視圖(self)到視圖樹,這導致無限遞歸在內部方法-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]。因此,您必須刪除self.alertLayer.delegate = self;以避免崩潰。如果您需要爲alarmLayer進行委派,則可以創建不同的對象。

+0

謝謝,我不知道一個UIView只能有一個圖層引用它作爲一個委託。 – davey555

相關問題