从C到Objective-C的回调方法

时间:2012-08-30 09:31:38

标签: iphone objective-c ios c

我有一个Objective-C类。我正在做的是我在我的Objective-C类中调用C函数[这个C函数我在一个文件中实现,它是这个示例ios项目的一部分]。所有的C函数都运行正常,到目前为止还没有问题。

当我尝试在C文件中调用异步函数时,该函数会在一段时间后响应objective-c类。我在C中调用了函数指针,它在Objective-C类中被正确触发。请检查以下代码段。我想在回调方法上做一些与UI相关的操作。那可能吗 ?如果没有其他方法吗?你能尽快给我答复吗?感谢。

C档案:

void my_int_func(int x);

void test_asyn_fun ()
{
    /* This code is for Sleep logic */
    for (int i=0; i<50000; i++) {
        // sleep
    }
    /* Sleep End */
    void (*foo)(int);
    foo = &my_int_func;
    foo(25);
}  

Objective-C文件:

void my_int_func(int x) // this is call back method 
{
    printf( "%d\n", x ); // working properly 
    [self anyMethodInMyClass]; // I am unable to use self in this function.
}

其实我的要求是

我有C代码,可以进行Voip通话功能。 我从Objective-C [iOS]代码调用C函数。 如果接收方已断开呼叫,则会调用我的一个C函数并停止该过程。但我的UI仍然显示调用相关的UI。我想解雇那个。

这里,如何从C函数向Objective-c类发送通知以关闭UIView。任何人都可以帮助我。

实际上我使用了函数指针,但它不起作用。

4 个答案:

答案 0 :(得分:2)

我也遇到了这个问题。我假设你正在使用PJSIP作为你的VoIP应用程序。

您要做的是创建一个指向您要向其发送消息的Objective-C类的指针。您已经认为不能从C回调中调用Objective-C函数。

static YourObjCClass *objCClassPtr

@property (nonatomic, retain) YourObjCClass *class

初始化所述类时,让静态指针指向Objective C对象的指针。 (指向对象指针的指针)

objCClassPtr = class;

您现在可以使用C函数中的 [objCClassPtr message]向Objective-C对象发送消息,就像您要编写[class message]

一样

你可以用同样的方式指向self

答案 1 :(得分:2)

首先感谢Ricardo Kloth,现在它正在为我工​​作。

这是我的代码......

Objective-C代码:

static id staticObject = nil;

@Implementation MyObjCclass

init
{
    ....

    staticObject = self;
}

// C fun
void functionPointer() 
{ 
    [staticObject message]; // it's working 
}

-(void) message
{

}

@end

答案 2 :(得分:0)

您可以使用块。 Blocks可用于纯C和C ++,块也始终是Objective-C对象。

C++ Blocks Objects

答案 3 :(得分:0)

即使在Blocks中,您也无法正确访问实例变量。请检查以下代码段。

//这是简单的区块代码

NSString *(^ trimTheStr)(NSString *)= ^(NSString * str) {

[self myInstanceMethods]; // This will show error right 

NSString *result = nil;

result = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

return result;

};