0

我有一些自定义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];
}

他们也有 a- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;里面除了 a 之外什么都没有NSLog

我将它们全部添加到我的 main 中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日志显示为。我想这与我启用的ARC"EXC_BAD_ACCES (code=1, address=...")有某种关系。

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

4

2 回答 2

1

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

于 2013-05-12T13:21:12.777 回答
0

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

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

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

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

于 2013-05-12T14:32:07.147 回答