2012-04-27 19 views
10

Attualmente sto imparando da solo la programmazione con obiettivi c e iOS e mi sono trovato bloccato con codice non funzionante a causa di questo errore sottile per un'ora. Si consideri il seguente codice:Nome metodo vuoto, cosa fa effettivamente?

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

A prima vista (e per chiunque nuovo) questo appare come un getter override per la proprietà name. Ma c'è un molto sottile : che non dovrebbe essere lì. Qui non ottieni nessun avvertimento/errore dal compilatore/parser/runtime, quindi la mia domanda è: in che cosa finisce effettivamente?

Ho provato a immaginare un modo di chiamare questo metodo una volta che ho visto l'errore, ma non sono riuscito nei miei pochi tentativi.

risposta

13

La firma del metodo - (NSString *):name rompe al seguente:

  • - Si tratta di un metodo di istanza (rispetto a un metodo di classe con un +).
  • (NSString *) Restituisce una stringa.
  • : Se dovessi pronunciare il nome di questo metodo, si chiamerebbe semplicemente "due punti". : dice al compilatore che il tuo metodo accetta anche un parametro.
  • name C'è un parametro chiamato nome.

Quando non si specifica un tipo, il compilatore presuppone che volevi dire id, quindi questo metodo in realtà dà corpo ad essere - (NSString *):(id)hello

Una chiamata valida a questo metodo potrebbe essere: [self :@"hello"].

È possibile fare cose davvero strane perché : è un nome valido per un metodo e il compilatore assume id. Potresti, se lo volessi, avere un metodo chiamato - :::. Il compilatore assumerebbe che intendessi il valore - (id):(id):(id):(id), un metodo che restituisce un oggetto di tipo id e accetta tre parametri di tipo id. Lo chiameresti in questo modo: [self :@"hello" :anObject :myObject];

+3

+1, semplicemente per "Se dovessi pronunciare il nome di questo metodo, sarebbe semplice chiamarlo ... due punti". – Perception

+0

In realtà, il nome del metodo è "stringa vuota". Quando si parlano i nomi dei metodi, in genere non si dicono i due punti, anche se sono lì ... confusi, lo so ... ma è un po 'come "," s in lingua inglese. Una pausa o connettore, ma non parlato. – bbum

+0

@bbum In realtà Apple afferma che il modo ufficiale per dire un metodo è quello di dire tutti i due punti. Guardando la linea nella documentazione in questo momento ... –

3

Un metodo dichiarato come quello che hai postato è raro (e di stile scadente, imo). L'Objective-C dovrebbe essere prolisso. Metodi di abbattere in questo modo:

  1. Primo carattere: o - o +. - significa che si tratta di un metodo di istanza, + significa che si tratta di un metodo di classe.
  2. Valore tra parentesi: il tipo di restituzione del metodo. Nel tuo esempio, il metodo restituisce un (NSString *).
  3. Il resto (prima delle parentesi graffe) è il nome del metodo insieme a tutti i parametri che prendono. Si potrebbe avere un nome senza parametri, nel qual caso il nome del metodo non avrebbe un : in esso. Ad esempio - (void) reload; Questo sarebbe un metodo che non restituisce un valore e non accetta parametri.
  4. Se il tuo metodo accetta parametri, questi verranno mixati nel nome del metodo e di solito dichiareranno il tipo (a differenza del tuo esempio).Come ad esempio - (NSString *) reverseString:(NSString *) stringToReverse; In questo esempio il nome del metodo sarà reverseString: prende un parametro, uno NSString* che verrà chiamato stringToReverse nella definizione del metodo.
  5. Di solito, se si vede un : senza tipo, sarà un caso come - (float) addThreeValues::: Questo metodo restituisce un valore float e accetta 3 parametri. Questa sarebbe una definizione appropriata perché i tre valori non hanno importanza quale ordine sono forniti perché li stiamo semplicemente aggiungendo.
Problemi correlati