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 中没有对象(structs 没有实例方法)。相反,这是 C++ 中用于实例方法的语法。 @Matteo Italia:但myObject 可能是struct 的一个实例,其中有一个名为myMethod 的成员是一个指向函数的指针,那么myObject.myMethod(arg) 将是完全有效的C。在 C 中实现对象时,这种结构很常见。 @mu:我仍然可以说你的观点是用法,而我的观点是语言 POV。但我只会说“经验教训”。 :)【参考方案3】:

第一个是独立功能。第二个是Objective-C 类的实例方法。所以我想如果你真的在写一个类,你会需要第二个版本。

【讨论】:

独立函数* 简单地提及“免费”函数可能会与 malloc/free 混淆。

以上是关于C 函数与 Objective-C 方法?的主要内容,如果未能解决你的问题,请参考以下文章

快速调用objective-c类方法

Objective-C与Swift下的自定义打印函数(Debug和Release)

如何从 AudioUnits C 函数调用 Objective-C 方法? (iOS)

Objective-C 之字符串与数值

将 NSStrings 转换为 C 字符并从 Objective-C 调用 C 函数

Objective-C iOS应用程序中的C风格函数[关闭]