C 函数与 Objective-C 方法?
Posted
技术标签:
【中文标题】C 函数与 Objective-C 方法?【英文标题】:C function vs. Objective-C method? 【发布时间】:2011-06-18 07:46:55 【问题描述】:两者有什么区别?如果我正在编写一个程序,我什么时候需要这个:
void aFunction()
//do something
我什么时候需要这个:
-(void)aMethod
//do something else
【问题讨论】:
【参考方案1】:实际上,Objective-C 方法只是一个开头总是有两个参数的 C 函数。
这个:
-(void)aMethod;
完全等价于这个:
void function(id self, SEL _cmd);
Objective-C 的消息是这样的:
[someObject aMethod];
完全等同于这个(几乎 - 存在超出此答案范围的可变参数 ABI 问题):
objc_msgSend(someObject, @selector(aMethod));
objc_msgSend() 找到方法的适当实现(通过在someObject
上查找),然后通过尾调用优化的魔力,跳转到方法的实现,出于所有意图和目的,与 C 函数调用完全一样,如下所示:
function(someObject, @selector(aMethod));
从字面上看,Objective-C 最初只是作为一个 C 预处理器实现的。 任何你在 Objective-C 中可以做的事情都可以直接重写为 C。
但是,这样做将是一件彻头彻尾的痛苦,而且除了令人难以置信的教育经验之外,不值得您花时间。
一般来说,在与对象对话时使用 Objective-C 方法,在使用纯 C goop 时使用函数。鉴于几乎所有 Mac OS X 和 ios 都提供了 Objective-C API——当然对于 UI 级编程入口点来说完全如此——那么你大部分时间都使用 Obj-C。
即使在编写您自己的相对独立的模型级代码时,您通常也会使用 Objective-C,因为它在状态/数据和功能之间提供了一种非常自然的粘合剂,是面向对象编程的基本租户。
【讨论】:
非常简洁和有用。我记得最初的 C++ 也只是一个预处理器。【参考方案2】:在 Objective-C 中,每个函数都对一个 对象 进行操作,例如
[myObject myFunction]
C 方法具有以下形式:
return-type function-name(argument1, argument2, etc)
Objective-C instance 方法具有以下形式:
-(return-type)function-name:argument1
或用于多参数函数
-(return-type)function-name:argument1 function-name:argument2
我在 Obj-C 编程中总是使用 Objective-C 风格的方法,即使你仍然可以使用 C 类型的函数。
我想 C 中与 [myObject myMethod:arg]
的等价物可能是 myObject.myMethod(arg)
【讨论】:
实际上在 C 中没有方法,只有独立的函数;您编写的最后一个“等效 C”语法是实例方法的 C++ 语法。 对我来说,方法和函数是一回事。即在语言上可以互换。一些编程语言确实有区别,但总体而言,有些人会在方法合适的地方使用函数,反之亦然。 @aqua:AFAIK,当你在谈论对象时,你在谈论方法(en.wikipedia.org/wiki/Method_%28computer_programming%29),否则你有一个函数或一个子例程。不过,我的基本观点是,您编写的最后一个“等效 C”语法没有意义,因为在 C 中没有对象(struct
s 没有实例方法)。相反,这是 C++ 中用于实例方法的语法。
@Matteo Italia:但myObject
可能是struct
的一个实例,其中有一个名为myMethod
的成员是一个指向函数的指针,那么myObject.myMethod(arg)
将是完全有效的C。在 C 中实现对象时,这种结构很常见。
@mu:我仍然可以说你的观点是用法,而我的观点是语言 POV。但我只会说“经验教训”。 :)
【参考方案3】:
第一个是独立功能。第二个是Objective-C 类的实例方法。所以我想如果你真的在写一个类,你会需要第二个版本。
【讨论】:
独立函数* 简单地提及“免费”函数可能会与 malloc/free 混淆。以上是关于C 函数与 Objective-C 方法?的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C与Swift下的自定义打印函数(Debug和Release)
如何从 AudioUnits C 函数调用 Objective-C 方法? (iOS)