2012-04-27 26 views
10

Actualmente estoy aprendiendo la programación de Object-c e iOS y me encontré atascado con un código que no funciona debido a este sutil error durante una hora. Considere el siguiente código:Nombre del método vacío, ¿qué hace esto realmente?

@property (strong, nonatomic) NSString *name; 
- (NSString *):name { return @"Some name"; } 

A primera vista (y para cualquier persona nuevo) esto se parece a un captador reemplazado por la propiedad name. Pero hay una muy sutil : que no debería estar allí. Usted no recibe ninguna advertencia/error del compilador/analizador/tiempo de ejecución aquí, entonces mi pregunta es ¿cómo termina esto realmente?

Traté de encontrar una forma de llamar a este método una vez que vi el error, pero no tuve éxito en mis pocos intentos.

Respuesta

13

La firma del método - (NSString *):name se rompe a lo siguiente:

  • - Es un método de instancia (en comparación con un método de clase con un +).
  • (NSString *) Devuelve una cadena.
  • : Si tuviera que decir el nombre de este método, simplemente se llamaría "dos puntos". : le dice al compilador que su método también acepta un parámetro.
  • name Hay un parámetro llamado name.

Cuando no se especifica un tipo, el compilador asume que quería decir id, por lo que este método en realidad da cuerpo a ser - (NSString *):(id)hello

Una llamada válida a este método sería: [self :@"hello"].

Puede hacer cosas realmente raras porque : es un nombre válido para un método, y el compilador asume id. Podrías, si realmente quisieras, tener un método llamado - :::. El compilador supondría que quería decir - (id):(id):(id):(id), un método que devuelve un objeto de tipo id y toma tres parámetros del tipo id. Lo llamarías así: [self :@"hello" :anObject :myObject];

+3

+1, simplemente para 'Si tuviera que decir el nombre de este método, simplemente se llamaría ... colon'. – Perception

+0

En realidad, el nombre del método es "cadena vacía". Cuando hablo de nombres de métodos, generalmente no dice los dos puntos, a pesar de que están allí ... confusos, lo sé ... pero es algo así como "," s en el idioma inglés. Una pausa o conector, pero no hablado. – bbum

+0

@bbum En realidad, Apple dice que la manera oficial de decir un método es decir todos los dos puntos. Mirando la línea en los documentos en este momento ... –

3

Un método que declara como el que publicaste es raro (y estilo pobre, imo). Objective-C se supone que es detallado. Métodos descomponen así:

  1. Primer carácter: De cualquier - o +. - significa que es un método de instancia, + significa que es un método de clase.
  2. Valor entre paréntesis: el tipo de devolución del método. En su ejemplo, el método devuelve un (NSString *).
  3. El resto (antes de las llaves) es el nombre del método junto con los parámetros que toman. Podría tener un nombre sin parámetros, en cuyo caso el nombre del método no tendría un :. Tal como - (void) reload; Este sería un método que no devuelve un valor y no toma ningún parámetro.
  4. Si su método toma parámetros, se mezclarán en el nombre del método y generalmente declararán el tipo (a diferencia de su ejemplo).Como - (NSString *) reverseString:(NSString *) stringToReverse; En este ejemplo, el nombre de su método sería reverseString:, necesita un parámetro, un NSString* que se llamará stringToReverse en la definición del método.
  5. Normalmente, si ve un : sin tipo será un caso como - (float) addThreeValues::: Este método devuelve un flotante y toma 3 parámetros. Esta sería una definición apropiada porque los tres valores no importan en qué orden se proporcionan porque los estamos agregando.
Cuestiones relacionadas