Objective-C和Quartz Composer; [qcView pauseRendering]导致Bad_Access

时间:2011-02-06 00:18:47

标签: objective-c xcode grand-central-dispatch quartz-composer

提前谢谢。

我有一个石英作曲家视图(下面的qcView),并在一个随机的方向移动一个图像(一个蚂蚁,如果你想知道代码),直到它在QCView的中间发现它是'home'。 pauseRendering是必要的,这样我们就能看到蚂蚁一寸一寸地移动;没有它,蚂蚁就会出现在它的“家”。

while([self distance] > acceptableOffset){
    [qcView pauseRendering];
    [self moveTowardsDestination:@"home"];
    [qcView resumeRendering];
}

这对于一只蚂蚁来说非常好。

当我在等式中添加另一个蚂蚁时,我使用一个调度队列和两个块。

    dispatch_async(queue, ^{
        [theAnt findCenter];
    });

    dispatch_async(queue, ^{
        [otherAnt findCenter];
    });

当这个代码运行时,两个阿姨同时赶到他们家 - 我们正在寻找的确切行为。但是,当我停止执行并再次构建时,我立即从[qcView pauseRendering]方法中的某处获得Exc_Bad_Access。清洁&构建它将完美地运行一次。 随着pauseRendering和resumeRendering被移除,蚂蚁将立即出现在他们的家中。

显然,QCView pauseRendering方法有一个本地数组,它不断增长和缩小,使用单个QCView和访问它的多个块,您可以看到问题的根源。

我研究了QCView documentation,似乎无法在那里找到灵感; pauseRendering的文档很少。虽然我确定你们都没有尝试过像我这样愚蠢的事情,但我希望有人能够有实际修改QCView的经验,并且能够指出我的正确(错误......读“任何!”)方向

[编辑:我尝试过“while(![qcView isPausedRendering])的变体”,如果有帮助的话。]

2 个答案:

答案 0 :(得分:2)

您确定QCView实例实际上支持并发吗?

极不可能。如果您正在查看来自单独线程或队列的视图 - 甚至是非后同时来自后台队列/线程 - 您很可能违反了QCView的并发规则。

我怀疑你必须从主线程中操纵视图,或者至少从一个线程中操作视图。

(不幸的是,我找不到任何关于此的具体信息)。

答案 1 :(得分:1)

解决了它。

原来我大大高估了这个问题。简单修复使用

     usleep(10000);

去图。

这最初是在代码中,但是它被替换为dispatch_suspend()。在暂停之前在线上睡眠,实现期望的活动。

如果有人遇到类似问题,请随时给我发电子邮件。