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

How to assign dispatch_queue_t to variable in a structure

本文关键字:结构 变量 分配 dispatch queue      更新时间:2023-10-16

我对Objective C还比较陌生,很容易被各种类型所混淆。我使用的是SquareCam示例项目中的代码,该项目包含在一个更大的项目中。它工作得很好,但现在我想保存videoDataOutputQueue,它的类型是dispatch_queue_t,这样我就可以在项目的其他地方使用它。它必须通过一些C++代码才能最终返回到Objective 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>
}

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

谢谢,Ken

由于您提交的"代码"存在语法错误,您的问题变得不必要地难以理解。这显然不是你真正的代码,所以我们无法猜测到底应该发生什么。例如,您使用struct保留关键字,就好像它是一个值一样。

考虑到您所说的坏访问发生在哪里,这与调度队列无关。看起来myStruct变量应该是指向某种结构的指针,但它只是一个垃圾指针。因此,试图将值分配给其中一个字段的操作最终会写入一个无效的内存地址。这个领域的性质并不重要。

问题显然恰恰出现在您作为"<示例代码中的其他东西>"而忽略的代码中。所以,你需要证明这一点。事实上,您需要展示您的真实代码。

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

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