6

我可以像这样在 Objective-C 类实现中定义 c 函数和变量:

@implementation MyViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    cfunction();
}

// variable inside class
NSString *message = @"this is c function inside objective-c class";

// c function inside class
void cfunction() {
    NSLog(@"%@", message);
}

@end

结果

this is c function inside objective-c class

此代码可以正常工作,没有任何警告和错误。
它是有效的 Objective-C 代码吗?
在 Objective-C 类中定义变量和 c 函数是否安全?
是否有关于此语言规范的文档?

4

4 回答 4

3

是的,这是正确且安全的,但您应该尽量避免。如果您需要一些 C 函数,请在单独的文件中定义它(并在单独的头文件中声明它)。

从技术上讲,Obj-C 是 C 语言之上的一个薄层,您可以在 Obj-C 源代码的任何位置使用任何 C 功能。但是,您应该遵守编码风格,而不是混合使用两种语言。

于 2012-11-16T15:06:42.037 回答
2

它是有效的 Objective-C 代码吗?

是的。

在 Objective-C 类中定义变量和 c 函数是否安全?

是的。类中定义的函数的一个特殊属性是此类函数可以直接访问作为指定类实例的对象的私有和受保护的 ivars。

是否有关于此语言规范的文档?

请参阅围绕此 SO 问题的讨论。

于 2012-11-16T15:07:30.477 回答
1

对不起,之前的答案在第三部分是非常错误的。

在objective-C 类的@implementation 中实现的C 函数不是该类的方法,而是简单的全局C 函数。

当然,可以将它们写在那里,有时甚至是有益的,因为它们是“类私有的”——其他代码将看不到它们,因为它们在@implementation 范围内。

但是 - 他们无法访问任何 iVar、self、super或与类或实例相关的任何内容。它们是 C 函数,而不是 Obj-C 方法。

任何访问 iVars 或 self 或 super 等的尝试都会产生编译器错误,提示“符号 xxx 未知”。

于 2014-11-23T15:25:58.487 回答
0

除了所有其他答案(尤其是莫蒂的):

您可以在 C 函数前面加上 'static' 关键字。“静态”意味着只能从它所在的 C 文件中使用该函数。不能从该 C 文件外部导出或调用它。例如。如果头文件中有静态函数,您将获得它的多个副本。

就这么简单:

原型:

static void cfunction();

执行:

static void cfunction() {
    NSLog(@"%@", message);
}

- 现在尝试从不同源文件中的代码调用它。

...而且混合 Objective-C 和 C 并没有错。一般来说:Objective-C 是sluggish。C++ 很,而 C 相当快。-因此,如果您有很多调用的子例程(或内联函数),请使用这些 C 函数而不是 Objective-C,因为 ObjC 会拖下您的循环。

于 2014-11-23T17:12:13.477 回答