2013-04-12 3 views
5

UIView 서브 클래스에서 CALayer를 하위 레이어로 추가하려고합니다. 그러나 init 메소드 내에 하위 레이어를 추가하면 다른보기 나 창에보기를 추가 할 때 EXC_BAD_ACCESS이됩니다. .UIView init 내에서 CALayer 하위 레이어 추가하기

초기화 방법

- (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가보기 컨트롤러 또는 UIWindow 내부 [self.view addSubview:alertView]를 호출 한 후에 발생한다.

+0

'alertLayer' 속성에 사용하는 메모리 관리 의미는 무엇입니까? – jlehr

답변

9

은 두 층 뷰 트리이보기 (self)을 첨가 할 때 동일한 대리인 self, 이것은 내부에있어서 -[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:] 무한 순환이 리드 (self.layerself.alertLayer)를 갖는다. 따라서 충돌을 피하려면 self.alertLayer.delegate = self;을 제거해야합니다. alarmLayer을 위임해야 할 경우 고유 한 개체를 만들 수 있습니다.

+0

감사합니다. UIView에 위임자로 참조하는 레이어가 하나 밖에 없다는 것을 알았습니다. – davey555