纯C函数调用Objective-C方法?

7
好的,我已经阅读了半打关于这个主题的线程,但是没有一个解决方案能够满足确切的需求。
问题:
纯C(.c)函数如何调用纯Objective-C(.m)类中的方法?
每个示例/答案都在Objective-C(.m)方法内部使用C。我有一个纯C库,我必须为其创建模拟器,因此我需要保持我的内核在纯C中,并调用Objective-C中更高级别的仿真方法。
我尝试创建引用并调用方法,但所有尝试均失败。方括号符号也无法使用。在Obj-C中创建全局变量并尝试在纯C中使用它不起作用,好像命名空间被隔离了一样。
有人做过这个吗?
下面是流程图:
Obj-C UIButton CLICKED->调用Obj-C方法->调用C函数->调用Obj-C方法

4
c没有类! - Anoop Vaidya
抱歉,打错字了。就像标题中所说的那样,我是指函数。感谢您指出技术细节。 - Mark Löwe
你可以很好地实现你的目标,但你必须有一个合并点。你不能保持两者分开,同时又使用它们。创建你的test.c文件,在所需的converge.m文件中导入你的test.c文件,你将拥有所有的方法。使用这个converge.m文件从c文件中获取结果,并将其更改为objective-c的消费。例如: - amar
这是一个关于C++的示例(也可以用于纯C):https://dev59.com/FXNA5IYBdhLWcg3wL6sc - avdyushin
在包装类中使用函数指针和混合C和Objective-C方法 - amar
显示剩余2条评论
3个回答

3
经过多次尝试,我发现将我的核心C库使用 .m 后缀转换为 NSObject 是解决问题的最优雅方法。来回调用的方法立即得到解决。这个改变确实会修改我的原始库,但是只有一点点,很容易处理。因此,总结如下:
我的原始C文件被重命名为使用 .m 后缀。然后我添加了
@interface myCLibrary : NSObject

@end

我将代码添加到我的.h文件中,并将其添加到以前的.c文件中,现在已重命名为.m文件。

@implementation myCLibrary

@end

只需记住,在这些接口/实现声明之间不要粘贴C函数。只有Objective-C可以放在这些语句中。一旦我做到了这一点,调用C函数和回调其他C函数就很好用了。
非常感谢你的所有帮助。

1
Objective C 可以编译 C 方法而无需任何修改。要从 Objective-C 类中调用 C 方法,只需像在 C 中一样包含头文件,然后直接调用方法即可。假设您有一个名为 test.h 的 C 头文件,在其中有一个方法 sum(int i, int j);,则首先包含 test.h,然后调用 test(1, 2); 如果您想调用 C++ 方法,请使用 Objective-C++(.mm 扩展名),并按上述方式进行操作。

一个更正:只有C语言,不包括C++。Objective-C++可以调用C++方法。 - doptimusprime
你知道吗,我尝试了这个,但是我得到了一个错误:"implicit declaration of function "test" is invalid in C99." 我正在使用GNU99。我猜C99是用于链接的C端? - Mark Löwe
为避免C99错误,您可以按照以下步骤操作:https://dev59.com/G2Uo5IYBdhLWcg3wrhFD - Abdullah Md. Zubair
这些解决方案的挑战在于测试方法已在导入的视图控制器中声明,因此再次声明可能会使编译器认为它属于其他地方。 - Mark Löwe
实际上,我是在说要为C语言创建头文件,它应该是用C语言编写的。您可以参考以下链接了解如何在C语言中创建头文件:https://dev59.com/PXE85IYBdhLWcg3wVR6g - Abdullah Md. Zubair
显示剩余2条评论

0

希望我理解你的意思没错!

你可以通过回调函数来实现这个。

在你的C文件中使用以下代码:

定义回调类型

eventcallback g_callback;

实现回调类(由Objective-C代码执行)

void comm_set_callback(eventcallback callback){
   g_callback = callback;
}

在Objective-C中:

设置回调函数(例如:在viewDidLoad()中)

comm_set_callback(&testfkt);

由extern C函数调用的C方法

void testfkt(){
 [refToSelf testmethod];
}

从C方法调用的Objective-C方法testfkt

-(void)testmethod{
   ...
}

@MarkLöwe 不要机械地替换。那些是元语法类型。你必须将它们更改为由你定义的实际类型。 - user529758
请在您的.h文件中使用以下代码: typedef void (*eventcallback)(void); - nirvana002
你是说这行代码里应该是"&testmethod"吗? comm_set_callback(&testfkt); - Mark Löwe
不,testmethod是在Objective-C的.m文件中从C函数调用的Objective-C方法。您可以使用以下方式从C文件调用Objective-C方法:(*g_callback)(); - nirvana002
那么我该如何将ObjC&test函数发送到我的C函数? (顺便说一句,我的UIKit突然无法解析我的ViewController,对其他类很好用,但在编辑期间突然失败,令人困惑)。 我的理解是,在viewDidLoad方法期间,我发送了我的方法的&ref到C函数以供以后调用。 - Mark Löwe
显示剩余12条评论

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