2009-08-30 43 views
6

我想用C函數啓動一個新線程,而不是一個Objective-C方法。我試圖在Cocoa中可以使用C函數作爲選擇器嗎?

[NSThread detachNewThreadSelector: @selector(func) toTarget: nil withObject: id(data)]; 

在那裏我有

void func(void *data) { 
    // ... 
} 

datavoid *,但我得到了objc_msgSend運行時墜毀,從

-[NSThread initWithTarget:selector:object:] 

我能做些什麼,而不是叫什麼名字?它甚至有可能嗎?

回答

3

用一個簡單地調用該函數的方法創建一個Objective-C類。採取該方法的選擇器並將其傳遞給NSThread API。

+0

好吧,是的,我的意思是,沒有這樣做。換句話說,我想知道我是否缺少一些語法 –

+1

沒有NSThread調用方法,所以你別無選擇。 – Mark

+5

我不認爲有一個簡單的句法來做到這一點。選擇器用於向對象發送消息。發送消息與簡單地調用函數不同。基本的機制有點不同。 –

3

嗯,我不確定是否有可能,但請記住每個Objective-C方法都有兩個隱含/隱藏的參數,self_cmd。一個IMP通常typedef是倒是這樣的:

typedef id (*IMP)(id,SEL,...); 

如果你想傑裏 - 鑽機的方法和選擇,你需要有一個看起來像這樣的方法:

void func (id self, SEL _cmd, void *firstParameter); 

但即使是,您需要在運行時註冊一個選擇器名稱,然後您需要將該選擇器與該方法相關聯,但是這是在逐個類的基礎上完成的(即,類可以具有相同選擇器名稱的不同實現),所以你至少需要有一個虛擬課堂。

創建該類的虛擬類和虛擬實例比調用各種運行時API僅僅爲了獲得NSThread來調用單個C函數要簡單得多。

0

我想用一個C函數來啓動一個新的線程,而不是Objective-C的方法

那麼你爲什麼不只是使用:

  1. POSIX線程,
  2. GCD?

dispatch_async_f()(man)適合正是爲了這個目的。

相關問題