C函数与Objective-C方法?

Jum*_*hyn 37 c methods function objective-c

两者有什么区别?如果我正在写一个程序,我什么时候需要这个:

void aFunction() {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

我什么时候需要这个:

-(void)aMethod {
    //do something else
}
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 79

实际上,Objective-C方法只是一个C函数,开头时始终存在两个参数.

这个:

-(void)aMethod;
Run Code Online (Sandbox Code Playgroud)

完全等同于:

void function(id self, SEL _cmd);
Run Code Online (Sandbox Code Playgroud)

Objective-C的消息是这样的:

[someObject aMethod];
Run Code Online (Sandbox Code Playgroud)

完全等同于此(几乎 - 有一个超出本答案范围的可变参数ABI问题):

objc_msgSend(someObject, @selector(aMethod));
Run Code Online (Sandbox Code Playgroud)

objc_msgSend()找到方法的适当实现(通过查找someObject)然后,通过尾调用优化的魔力,跳转到方法的实现,为了所有意图和目的,它的工作方式与C函数完全相同看起来像这样的电话:

function(someObject, @selector(aMethod));
Run Code Online (Sandbox Code Playgroud)

从字面上看,Objective-C最初只是作为C预处理器实现的. 您可以在Objective-C中执行的任何操作都可以直接重写.

然而,这样做将是一个完全痛苦的屁股,并不值得花时间超越这种令人难以置信的教育经验.


通常,在使用直接C goop时,在与对象和函数交谈时使用Objective-C方法.鉴于几乎所有的Mac OS X和iOS都提供了Objective-C API - 对于UI级别的编程入口点来说当然也是如此 - 那么你大多数时候都会使用Obj-C.

即使在编写相对独立的模型级代码时,您通常也会使用Objective-C,因为它在状态/数据和功能之间提供了非常自然的粘合,这是面向对象编程的基本租户.


aqu*_*qua 9

在Objective-C中,每个函数都在一个对象上运行,比如

[myObject myFunction]

AC方法的形式如下:

return-type function-name(argument1, argument2, etc) {}

Objective-C 实例方法具有以下形式:

-(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++*语法. (6认同)
  • @aqua:AFAIK,你在谈论对象时谈论方法(http://en.wikipedia.org/wiki/Method_%28computer_programming%29),否则你有一个函数或一个子例程.不过,我的基本观点是你写的最后一个"等价C"语法没有意义,因为在C中没有对象(`struct`s没有实例方法).相反,这是**C++**中用于实例方法的语法. (4认同)