如果自定义UIView有> 1个子图层,app会在touchesBegan崩溃,为什么?

时间:2013-05-12 12:53:56

标签: ios objective-c cocoa-touch uiview automatic-ref-counting

我有一些自定义UIView对象,它们都像这样处理绘图:

- (void)drawRect:(CGRect)rect {
    // ^ I init the layers 1 and 2
    [self.layer insertSublayer:layer1 atIndex:0]; // 1 or more
    [self.layer insertSublayer:layer2 atIndex:1];
}

他们还有一个- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;,其中没有其他内容,只有NSLog

我将它们全部添加到我的主ViewController中,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CustomView *myViewWith1Layer = [[CustomView alloc] initWithFrame:CGRectMake(20, 20, 440, 260)];
    [self.view addSubview:myViewWith1Layer];

    CustomViewLayered *myViewWith2Layer = [[CustomViewLayered alloc] initWithFrame:CGRectMake(40, 260, 200, -120)];
    [self.view addSubview:myViewWith2Layers];
}

当我运行我的应用时,如果我点击只有一个图层的视图 - 我会显示NSLog,一切都很好。另一方面,如果我点击1 +层的视图,应用程序崩溃(objc_msgSend日志会显示"EXC_BAD_ACCES (code=1, address=...")。我猜这与 ARC 有某种关联,我已启用。

如何在视图中添加多个图层,而不会被 ARC 弄乱?

2 个答案:

答案 0 :(得分:1)

我认为这不是ARC问题,而是在drawRect中创建和插入图层 是错的。这应该在视图的init方法中完成(仅一次),例如在initWithFrame

答案 1 :(得分:0)

就我而言,解决方案肯定与ARC相关。

在初始化我的代表时,我立即将它们分配给layer.delegate属性,ARC将在此之后立即删除该对象。

因此,对于每个图层,我添加 strong @property (strong, nonatomic) delegatesClass *delegatesName并直接初始化到该属性。之后,我分配了layer.delegate = self.delegatesName

这确实解决了这个问题,虽然我不确定这是否是正确的做事方式。