2

我对Objective C还是比较陌生,很容易被各种类型混淆。我正在使用 SquareCam 示例项目中的代码,该代码已合并到一个更大的项目中。它工作正常,但现在我想保存类型为 dispatch_queue_t 的 videoDataOutputQueue,以便我可以在项目的其他地方使用它。它必须通过一些 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>
}

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

谢谢,肯

4

1 回答 1

1

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

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

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

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

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

于 2013-11-25T00:21:57.640 回答