Objective-C接口中的C函数是不是很糟糕?

时间:2013-01-17 10:22:27

标签: objective-c coding-style

我声明了一个带有一些函数和一些方法的接口。而不是声明:
-(void)foo;
+(void)bar;

我声明:
-(void)foo;
void bar();

我认为没关系。编译器认为没问题。其他程序员还认为没关系吗?

3 个答案:

答案 0 :(得分:2)

选择C函数或静态方法时的担忧:(从我的头脑中)

  • 名称冲突:首选静态方法。
  • 功能:名称就像道路,它们告诉你你在哪里以及你可以去哪里。如果代码与其他内容相关,则应将其设为类方法。即使它是无关方法(xxxUtils类)的垃圾转储。否则使用C函数。
  • 位置:首选静态方法作为在更高级别单元中对代码进行分组的方法(因为从30,000英尺处更容易看到和理解)。
  • 键入:C函数需要较少的内容。更多打字时,CGPointMake便利功能不会那么方便。
  • 链接:在运行时之前看到对C函数的错误调用。
  • 全局状态:不是选择标准,但值得一提的是,在OOP语言中,C函数和类方法的输出应仅依赖于它们的输入。触摸全局状态违背了封装,隐藏了依赖关系,使代码更难理解等等。
  • 重载:使用__attribute__((overloadable))标记时,C函数可能会过载。

答案 1 :(得分:1)

我不太明白问题的重点。您可以同样地将它们全部声明:

 -(void)foo;
 +(void) bar;
 void bar();

所有在目标C中都是合法的,并且可以与它们是不同的实体(实例方法,类方法,C函数)共存同名。您可以从前者中的任何一个调用void bar()而不会出现问题,但不能v / v,因为void bar()不会传递对self的引用。

如果问题是样式问题,我会将C函数与@interface分开声明,因为它们不是Objective-C。

对于Clang的最新版本,如果它们不供公众使用,则根本不需要声明这些......

更新

阅读@ Jano的答案之后,我现在更多地理解问题的重点:为什么选择一个类方法而不是一个可以获得相同结果的函数(无法访问self)。这些天我倾向于总是使用类方法,它似乎在obj-C上下文中有意义。 Jano的回答似乎非常详尽。

答案 2 :(得分:0)

这只是USED-TO的问题。

我会选择Objective-C方法,除非我需要一些只在C中可用的函数,比如pow()。

即使你想要添加一个C方法,我觉得它应该在一个单独的文件中,如AllCMethods.c它将更容易回忆,记住,使用所有obj-c方法和C方法。 / p>