【问题标题】:Objective-C and Quartz Composer; [qcView pauseRendering] causes Bad_AccessObjective-C 和 Quartz Composer; [qcView pauseRendering] 导致 Bad_Access
【发布时间】:2011-02-06 00:18:46
【问题描述】:

提前致谢。

我有一个 Quartz Composer 视图(下面的 qcView),并在随机方向上移动一个图像(蚂蚁的,如果你想知道代码的话),直到它在 QCView 中间找到它的“家”。 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。在 Clean & Build 之后,它将完美地运行一次。 移除 pauseRendering 和 resumeRendering 后,蚂蚁会立即出现在它们的家中。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    极不可能。如果你正在处理来自不同线程或队列的视图——即使是来自后台队列/线程的非并发视图——你很可能违反了 QCView 的并发规则。

    我怀疑您必须从主线程或至少一次从一个线程操作视图。

    (很遗憾,我找不到任何关于此的具体信息)。

    【讨论】:

    • 感谢您的快速回复。文档似乎很稀疏,随后的谷歌搜索不会产生有关“qcview 并发”的相关结果。直观地说,你猜锁定过程可以解决暂停问题吗?
    • 可能不会;您通常无法通过在其周围加锁来确保线程安全,因为您无法控制内部实现。我认为lists.apple.com 可能有一个 Quartz Composer 列表。如果是这样,询问更有可能联系到一位 QC 工程师。
    【解决方案2】:

    解决了。

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

         usleep(10000);
    

    去看看。

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

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

    【讨论】:

    • 如果您使用usleep() 作为同步原语,那么您做错了。保证在未来某个时候因为看似未知的原因而中断。
    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多