从C到Objective-C的回调方法

3
我有一个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
你认为在类外部存在self是如何实现的? - user529758
请问我们能否获得完整的(或至少更多的)源代码?最有可能的原因是您在类中使用了self而不是对象方法。当在对象上调用方法时,您需要从某个地方获取对象指针-我不知道您在C文件中如何获取它。 - marko
你知道 self 代表什么吗? - holex
我认为这应该会对你有所帮助 从Objective-C向C++方法传递一个block - Ivan Dyachenko
4个回答

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

我也遇到了这个问题。我猜你在为你的VoIP应用使用PJSIP。

你想做的是创建一个指向Objective-C类的指针,以便发送消息。你已经发现无法从C回调中调用Objective-C函数。

static YourObjCClass *objCClassPtr

@property (nonatomic, retain) YourObjCClass *class

初始化该类时,使静态指针指向Objective C对象的指针。(指向对象的指针)

objCClassPtr = class;

现在,你可以像写[class message]一样,在C函数中使用[objCClassPtr message]向Objective-C对象发送消息。

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


0

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

// 这是简单的块代码

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

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

NSString *result = nil;

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

return result;

};


0

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

C++ 块对象


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接