2012-05-23 64 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