2013-11-24 60 views
2

對於Objective C我還是比較新的,並且很容易被各種類型所困惑。我正在使用SquareCam示例項目中的代碼,併入大型項目中。它工作正常,但現在我想保存videoDataOutputQueue,它是dispatch_queue_t類型,以便我可以在項目的其他地方使用它。它必須通過一些C++代碼才能最終回到Objective C代碼中。因此,我試圖將它添加到我已經具有的結構中,作爲void *(void * videoDataOutputQueue;)如何將dispatch_queue_t分配給結構中的變量

但是,我沒有找到正確的方式來分配它,但未收到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

你已經做了你的問題不必要的困難理解,因爲「碼」你提出有語法錯誤。這顯然不是你真正的代碼,所以我們無法猜測真正應該發生的事情。例如,您使用struct保留關鍵字,就好像它是一個值。

鑑於您認爲發生錯誤訪問的位置,這與調度隊列無關。它看起來像你的myStruct變量應該是一個指向某種結構的指針,但只是一個垃圾指針。所以,試圖給其中一個字段賦值會導致寫入無效的內存地址。這個領域的本質是什麼並不重要。

問題顯然正是在你省略的代碼中,「<其他來自示例代碼的東西」。所以,你需要證明這一點。事實上,你需要展示你真實的代碼。

除此之外,dispatch_queue_t是C型。它不是特定於Objective-C的。因此,您可以在所有基於C的語言中使用它。沒有必要使用void*

與所有調度對象一樣,調度隊列被引用計數。如果你保持長期的參考,你需要確保它保持活着。所以,你需要用dispatch_retain()來保留它。同樣,當您使用dispatch_release()完成時,您需要釋放它。 (不要忘了當你替換一個你正在保存的參考文獻時,要發佈舊值)。

+0

我很抱歉,我急着趕緊提出了這個問題,真的搞砸了代碼,並沒有顯示我保留的地方未來參考的對象和其他錯誤。無論如何,我感謝你的幫助。我沒有意識到這是一個C類型,這有幫助。我明天要清理這個,然後再試一次。 – user938797

+0

如果dispatch_queue_t是C類型,那麼我應該可以將它添加到我的結構中,並且應該都是好的。但是當我嘗試,在我.h文件中我得到「未知類型名‘dispatch_queue_t’如果我創建該類型的獨立變量則是罰款 typedef結構{ 布爾debug_images; BOOL debug_segments; 等.... dispatch_queue_t videoqueue; << ---這裏的錯誤 } mystruct dispatch_queue_t othervideqoqueue; << ---這很好 我錯過了什麼? 謝謝, – user938797

+0

你忽略了包含必要的頭文件:'#include '。 –

相關問題