我仍然是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>
}
显然,这不是正确的方式,我不明白我在做什么。我从其他帖子中得到一些提示,但我遗漏了一些东西。
谢谢, 肯
答案 0 :(得分:1)
您的问题不必要地难以理解,因为您提供的“代码”存在语法错误。这显然不是你真正的代码,所以我们无法猜测究竟应该发生什么。例如,您使用struct
保留关键字,就好像它是一个值。
鉴于您说错误访问的位置,这与调度队列无关。看起来你的myStruct
变量应该是指向某种结构的指针,但它只是一个垃圾指针。因此,尝试将值分配给其中一个字段最终会写入无效的内存地址。这个领域的本质是什么并不重要。
问题显然在您省略的代码中,“&lt;示例代码中的其他内容&gt;”。所以,你需要证明这一点。实际上,您需要显示您的真实代码。
除此之外,dispatch_queue_t
是C类型。它不是Objective-C特有的。因此,您可以在所有基于C的语言中使用它。无需使用void*
。
与所有调度对象一样,调度队列是引用计数的。如果您长期参考它,您需要确保它保持活力。因此,您需要使用dispatch_retain()
保留它。同样,您需要在使用dispatch_release()
完成后释放它。 (当您替换另一个参考时,不要忘记释放旧值。)