gpt4 book ai didi

c++ - 如何将 dispatch_queue_t 分配给结构中的变量

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:25:23 25 4
gpt4 key购买 nike

我对 Objective C 还比较陌生,很容易被各种类型搞糊涂。我正在使用 SquareCam 示例项目中的代码,并将其合并到一个更大的项目中。它工作正常,但现在我想保存类型为 dispatch_queue_t 的 videoDataOutputQueue,以便我可以在项目的其他地方使用它。在最终回到 Objective C 代码之前,它必须通过一些 C++ 代码。因此,我试图将它添加到我已有的结构中,作为 void * (void *videoDataOutputQueue;)

但是,我还没有找到正确的方法来分配它而不会出现 EXC_BAD_ACCESS 运行时错误。由于 dispatch_queue_t 是一个 C++ 对象,我不能只使用它的地址吗?

   declared in the interface for squarecamviewcontroller:
@interface SquareCamViewController : UIViewController <UIGestureRecognizerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate,UIActionSheetDelegate>
{
AVCaptureVideoPreviewLayer *previewLayer;
AVCaptureVideoDataOutput *dataOutput;
AVCaptureVideoDataOutput *videoDataOutput;
dispatch_queue_t videoDataOutputQueue;
<other stuff>
}

后面的代码:

- (void)setupAVCapture
{
<other stuff from the sample code>
MYSTRUCT myStruct = (MYSTRUCT)struct; // make a pointer to the structure
myStruct->videoDataOutputQueue = (void *)videoDataOutputQueue; <<<- bad access here at runtime

<other stuff>
}

显然这不是正确的方法,我不明白我在做什么。我从其他帖子中得到了一些提示,但我遗漏了一些东西。

谢谢,肯

最佳答案

您的问题不必要地难以理解,因为您提供的“代码”存在语法错误。这显然不是您的真实代码,因此我们无法猜测真正应该发生的事情。例如,您使用 struct 保留关键字,就好像它是一个值一样。

鉴于您所说的错误访问发生的位置,这与调度队列无关。看起来你的 myStruct 变量应该是指向某种结构的指针,但它只是一个垃圾指针。因此,尝试为其字段之一赋值最终会写入无效的内存地址。该领域的性质是什么并不重要。

问题显然出在您省略为“<示例代码中的其他内容>”的代码中。所以,你需要证明这一点。事实上,您需要展示您的真实代码。

除此之外,dispatch_queue_t 是一个 C 类型。它不是特定于 Objective-C 的。因此,您可以在所有基于 C 的语言中使用它。无需使用 void*

像所有调度对象一样,调度队列是引用计数的。如果您要长期引用它,则需要确保它保持活力。因此,您需要使用 dispatch_retain() 保留它。同样,您需要在完成后使用 dispatch_release() 释放它。 (当您用另一个引用替换您保留的引用时,不要忘记释放旧值。)

关于c++ - 如何将 dispatch_queue_t 分配给结构中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20182557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com