2011-07-26 34 views
4

我注意到它們在創建時不返回指針,而是實際的對象。因此,要獲得一個指針,我想聲明它是這樣的:如何在類之間共享串行調度隊列?

dispatch_queue_t* queue; 
*queue = dispatch_queue_create("double_buffer_protection_queue", DISPATCH_QUEUE_SERIAL); 

在我的C++程序員說,應該工作,但它給出了一個錯誤BAD_ACCESS,所以我猜我接近這一錯誤的方法。

如果我想要一個可以被我的程序中的任何對象訪問的串行隊列,我該怎麼做?我上面展示的代碼是爲了進入AppDelegate類。

+1

我認爲它們不應該在'queue'之間有'*'指針。 – AechoLiu

+0

您的代碼與「int * a; * a = 0;」相同,它應該是「dispatch_queue_t queue; dispatch_queue_t * queue_pointer = &queue; * queue_pointer = ...」。 –

+0

如果你的'queue'對象是一個全局對象,那麼你需要解引用一個空指針。如果你的'queue'對象是一個自動變量,那麼你正在引用一個垃圾指針。無論哪種方式,這解釋了你看到的崩潰。 –

回答

1

在Grand Central Dispatch中,使用實際對象是正確的方法。例如,

class Manager 
{ 
    Manager() 
    { 
     m_queue = dispatch_queue_create("double_buffer_protection_queue", DISPATCH_QUEUE_SERIAL); 

     m_worker = new Worker(m_queue); 
    } 

    ~Manager() 
    { 
     dispatch_release(m_queue); 
     delete m_worker; 
    } 

    dispatch_queue_t m_queue; 
    Worker *m_worker; 
} 

然後隊列的另一個所有者必須保留和自己喜歡的Objective-C對象將其釋放。

class Worker 
{ 
    Worker(dispatch_queue_t queue) 
    // Worker(dispatch_queue_t &queue) /* reference might be ok. */ 
    { 
     m_queue = queue; 
     dispatch_retain(m_queue); 
    } 

    ~Worker() 
    { 
     dispatch_release(m_queue); 
    } 

    dispatch_queue_t m_queue; 
} 
4

GCD Referencetypedef struct dispatch_queue_s *dispatch_queue_t;

也許我找錯了樹,但我的直覺告訴我一個更地道的解決方案可能是使用一個類的方法裏面dispatch_once功能產生隊列多類實例可以發送工作(這不是C++,但你的基本想法):

+ (dispatch_queue_t)sharedQueue 
{ 
    static dispatch_once_t pred; 
    static dispatch_queue_t sharedDispatchQueue; 

    dispatch_once(&pred, ^{ 
     sharedDispatchQueue = dispatch_queue_create("theSharedQueue", NULL); 
    }); 

    return sharedDispatchQueue; 
} 

dispatch_once確保隊列創建整個運行期間只發生一次,所以你可以撥打[YourClass sharedQueue]安全且便宜,無論您需要它,只要您需要即可。

然而,我的直覺也告訴我,類/對象之間的共享隊列聞起來有點不好。如果您只想要一個應用程序範圍的隊列來提交雜項作業,全局隊列就足夠了嗎?如果你想用大量的對象進行一些密集的工作,我會本能地爲它們設置一個單獨的隊列。也許有一種更加優雅的方式來做你想做的事情?

+2

如果是'static'變量,如何使用'dispatch_release'釋放'dispatch_queue_t'變量? – Gon

+0

這有效。謝謝。 –