【问题标题】:Sending an Objective C instance a C Function向一个 Objective C 实例发送一个 C 函数
【发布时间】:2025-11-26 15:15:02
【问题描述】:

我在 MyClass 中有一个 C 函数,可以从该类内部调用它。是否可以将 C 函数的 MyClass 实例作为消息发送?

暂时解释清楚

MyClass *obj = [[MyClass alloc] init];
[obj myCFunction];

给出编译器错误:“接收器类型 'MyClass' 例如消息未声明具有选择器 'myCFunction' 的方法”。 myCFunction 在 MyClass.h @interface 中声明,完整代码在 MyClass.m 中的 @implementation 之前,如果从 MyClass.m 的 @implementation 中调用,则可以正常工作。因此,C 函数是否是私有的,我可以将其公开,以便我可以将其作为消息发送到 MyClass 的实例吗?

我正在尝试编写单元测试来测试某些计算的每个阶段,因此简单地创建一个目标 c 方法来调用 c 函数似乎不是一个有效的解决方案。

任何帮助将不胜感激

【问题讨论】:

  • 你不能发送一个C函数到一个Obj-C实例,他们会收到messages

标签: objective-c c methods


【解决方案1】:

不。发送消息是一个 Objective-C 构造,因此您必须为对象(或类)定义一个方法才能发送消息。你有两个选择:编写一个调用 C 函数的实例方法,或者将它应该使用的对象传递给 C 函数。

如果 C 函数在您的头文件中声明,则它对包含该头文件的所有文件都是公共的。因此,您可以从测试代码中调用它,如果您引用 .m 文件中声明的数据,它只是不知道您指的是什么对象。您应该通过传递对该对象的引用来明确您在 C 函数中引用的对象。在类实现中,将使用myCFunction(self) 调用 C 函数。然后通过这个引用访问任何对象的数据,而不是直接访问本地声明的变量。

【讨论】:

  • 谢谢,我还将我的 c 代码移到了单独的 cMethods.c 文件中,因为存在一些我无法修复的链接器错误。但是 myCFunction(self) 的想法非常有效,谢谢。
最近更新 更多