在UIView init中添加CALayer子图层

dav*_*555 5 calayer uiview uiwindow quartz-2d ios

我正在尝试将一个CALayer添加为UIView子类中的子层,但是当我在init方法中添加子层EXC_BAD_ACCESS时,我将视图添加到另一个视图或窗口时得到.

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;
}
Run Code Online (Sandbox Code Playgroud)

EXC_BAD_ACCESS[self.view addSubview:alertView]在视图控制器或UIWindow内部调用后引起.

Vit*_*erg 9

您有两个层(self.layerself.alertLayer)具有相同的委托self,-[UIView(Hierarchy) _makeSubtreePerformSelector:withObject:withObject:copySublayers:]当将此view(self)添加到视图树时,这会导致内部方法中的无限递归.因此,您必须删除self.alertLayer.delegate = self;以避免崩溃.如果您需要委托,则alarmLayer可以创建不同的对象.