2012-05-23 91 views
0

我不知道我可以說由於某些NDA功能而創建的應用程序有多少,儘管它可能不是新的我仍然想保存自己,但是我想知道是否有通過選擇器傳遞xmlDocPtr的方法?如果是這怎麼可能?我知道我可以接受一個char *並將其轉換爲NSString,但是xmlDocPtr具有相同的功能來轉換爲一個id類型?將xmlDocPtr對象傳遞給選擇器

回答

0

你是什麼意思「通過選擇器傳遞xmlDocPtr」?鑑於您似乎試圖將其轉換爲obj-c對象,我假設您正在嘗試使用-performSelector:withObject:?因爲如果你只是調用方法,對參數類型沒有限制。

如果您需要動態調用一個採用非obj-c對象的選擇器,則有兩種選擇。第一種和推薦的方法是創建一個NSInvocation

SEL sel = // selector that takes xmlDocPtr 
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:sel]]; 
[invocation setSelector:sel]; 
[invocation setArgument:&xmlDocPtr atIndex:2]; // 0 is self, 1 is _cmd 
[invocation invokeWithTarget:target]; 
// if you need a return value, use 
// typeOfReturnValue retVal; 
// [invocation getReturnValue:&retVal]; 

第二是投objc_msgSend()到適當的函數類型和呼叫的是,雖然這變得更加複雜(和有些體系結構相關的),如果有浮點值或所涉及結構的值(如方法參數或返回值)。如果你習慣使用obj-c運行時,你應該只採用這種方法。

+0

我試圖將對象傳遞給選擇器的原因是因爲我所有的計算和加載都是在後臺線程上完成的,我需要將計算/加載的數據發送到主線程以用於GUI目的。 – Seb

+0

@Seb:在這種情況下,最簡單的解決方案就是'dispatch_async(dispatch_get_main_queue(),^ {/ *您的主隊列工作在這裏* /})'(或者使用'dispatch_sync()',如果您確實需要的話,關於同步跨線程訪問的注意事項請看這裏)。 –

+0

你救了我的命。謝謝。 – Seb