2011-01-31 11 views
35

¿Cuál es la diferencia entre los dos? Si estoy escribiendo un programa, cuando se necesitaría un ésta:función C vs. método Objective-C?

void aFunction() { 
    //do something 
} 

y cuando voy a necesitar esto:

-(void)aMethod { 
    //do something else 
} 

Respuesta

77

En realidad, un método Objective-C es solo una función C con dos argumentos siempre presentes al principio.

Este:

-(void)aMethod; 

es exactamente equivalente a esto:

void function(id self, SEL _cmd); 

mensajes de Objective-C de es tal que esto:

[someObject aMethod]; 

es exactamente equivalente a esta (casi - - hay un argumento variado problema ABI más allá del alcance de esta respuesta):

objc_msgSend(someObject, @selector(aMethod)); 

objc_msgSend() busca la implementación adecuada del método (mirando hacia arriba en someObject) y luego, a través de la magia de una optimización de llamada de cola, salta a la aplicación del método que, para todos los efectos , que funciona exactamente igual que una llamada a la función C que tiene este aspecto:

function(someObject, @selector(aMethod)); 

literalmente, Objective-C se implementó originalmente como nada más que un preprocesador C. Cualquier cosa que pueda hacer en Objective-C podría reescribirse como C.

Hacer esto, sin embargo, sería un dolor en el culo y no vale la pena el tiempo más allá de la increíble experiencia educativa de hacerlo.


En general, se utilizan métodos de Objective-C cuando se habla de los objetos y la función cuando se trabaja con pegote C recta. Dado que prácticamente todos los sistemas Mac OS X e iOS proporcionan API Objective-C, sin duda alguna para los puntos de entrada de programación de nivel de interfaz de usuario, entonces usas Obj-C la mayor parte del tiempo.

Incluso cuando escribe su propio código de nivel de modelo que es relativamente independiente, normalmente usará Objective-C simplemente porque proporciona un pegamento muy natural entre la funcionalidad state/data &, un inquilino fundamental de la programación orientada a objetos.

+0

Muy conciso y útil. Recuerdo que el C++ original también era solo un preprocesador. – AlanObject

9

En Objective-C cada función opera en un objeto, como

[myObject myFunction]

método AC tiene la forma:

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

Un Objective-C ejemplo método tiene la forma:

-(return-type)function-name:argument1 {}

o para una función multi-argumento

-(return-type)function-name:argument1 function-name:argument2 {}

siempre uso de Objective-C métodos de estilo en la programación de Obj-C, aunque también puede usar funciones tipo C.

supongo que el equivalente en C a [myObject myMethod:arg] podría ser myObject.myMethod(arg)

+6

En realidad en C no hay métodos, solo funciones independientes; la última sintaxis de "C equivalente" que escribió es la sintaxis * C++ * por ejemplo, métodos. –

+0

Para mí, los métodos y las funciones son las mismas cosas. es decir, intercambiable en el lenguaje. Algunos lenguajes de programación hacen distinciones, pero en general tendrá a algunas personas usando la función donde el método es apropiado y viceversa. – aqua

+4

@aqua: AFAIK, hablas de métodos cuando hablas de objetos (http://en.wikipedia.org/wiki/Method_%28computer_programming%29); de lo contrario, tienes una función o una subrutina. Aún así, mi punto fundamental fue que la última sintaxis de "C equivalente" que escribió no tiene sentido, porque en C no hay objetos ('struct's no tiene métodos de instancia). En cambio, esa es la sintaxis utilizada en ** C++ ** para los métodos de instancia. –

2

La primera es una función independiente. El segundo es un método de instancia para una clase Objective-C. Así que supongo que necesitarías la segunda versión si estás escribiendo una clase.

+0

gratis -función de servicio * Simplemente mencionar una función 'libre' podría confundirse con malloc/free. – dcousens

+0

@Daniel De hecho, edité mi respuesta. –

Cuestiones relacionadas