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

时间:2013-11-24 23:37:28

标签: c++ objective-c types mixed-code

我仍然是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>
}

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

谢谢, 肯

1 个答案:

答案 0 :(得分:1)

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

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

问题显然在您省略的代码中,“&lt;示例代码中的其他内容&gt;”。所以,你需要证明这一点。实际上,您需要显示您的真实代码。

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

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