我有一些自定义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 弄乱?
答案 0 :(得分:1)
我认为这不是ARC问题,而是在drawRect
中创建和插入图层
是错的。这应该在视图的init方法中完成(仅一次),例如在initWithFrame
。
答案 1 :(得分:0)
就我而言,解决方案
在初始化我的代表时,我立即将它们分配给layer.delegate
属性,ARC将在此之后立即删除该对象。
因此,对于每个图层,我添加 strong @property (strong, nonatomic) delegatesClass *delegatesName
并直接初始化到该属性。之后,我分配了layer.delegate = self.delegatesName
。
这确实解决了这个问题,虽然我不确定这是否是正确的做事方式。