2011-02-10 27 views
12

Basta andare avanti con lo sviluppo di iPhone e Objective-C.Quando utilizzare i due punti con un @selector

Ieri stavo cercando di addObserver per una notifica in vista del mio e ho continuato a ottenere questo errore:

unrecognized selector sent to instance

ho rintracciato verso il basso per il fatto che avevo bisogno di includere i due punti finali al mio selettore argomento:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil];

Oggi, ho pensato che ero intelligente perché quando si imposta l'argomento di azione a un pulsante, mi sono ricordato il mio errore di ieri, e ha aggiunto i due punti per l'argomento di azione. L'argomento action prende @selector, proprio come l'argomento selector durante l'impostazione di un osservatore per una NSNotification, quindi ho pensato che stavo facendo la cosa giusta.

Tuttavia, con il seguente codice:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside];

ottengo lo stesso identico errore:

unrecognized selector sent to instance

Che cosa dà? Perché uno @selector richiede due punti finali e l'altro no? Quali sono le regole che dovrei seguire per quando dovrebbe essere incluso e quando dovrebbe essere lasciato fuori, e perché non posso sempre fare solo uno o l'altro?

Grazie!

+1

È un colon, non un punto e virgola. Ad ogni modo, qual è il prototipo del tuo metodo 'nameOfMySelector:'? Che tipo di argomento vuole? – BoltClock

+0

Ti riferisci allo stesso metodo in entrambi i casi? – BoltClock

+0

Ha! Una svista da parte mia; Ho modificato il post per fare riferimento a loro come due punti. – djibouti33

risposta

29

Come già detto da boltClock, il personaggio si fa riferimento è in realtà un colon. La differenza tra @selector(method) e @selector(method:) è la firma del metodo. La seconda variante prevede che un parametro venga passato.

@selector(method) si aspetterebbe il metodo: -(void)method

@selector(method:) si aspetterebbe il metodo: -(void)method:(id)someParameter

+3

Eccoci, è esattamente così. Ha un senso totale. Grazie per la risposta rapida e per la lezione di grammatica :) – djibouti33

8

Sembra che manchi un concetto qui: colon è, in qualche modo, una parte del nome del metodo. Per esempio, il metodo

-(IBAction) doIt:(id)sender; 

ha nome doIt:. Quindi, il colon dovrebbe essere usato per fare riferimento a questo metodo.
Ma questo metodo non ha i due punti alla fine

-(IBAction) doItWithoutParameter; 

Lo stesso vale per i metodi di accettare più argomenti, hanno nomi come doItWithParam1:andParam2:

2

I due punti indica che il metodo prende un parametro.

[someObject performSelector:@selector(doSomething:)] significa che doSomething è in attesa di un parametro.

[someObject performSelector:@selector(doSomething)] significa che DoSomething non ha bisogno di alcun parametro.

2

Nel tuo caso:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(nameOfMySelector:) name:@"BBLocationServicesAreDisabled" object:nil]; 

- (void) nameOfMySelector: (NSNotification *) notification { 
    /* this method would require the semi-colon */ 
} 

o in questo caso:

[self.callToActionButton addTarget:self action:@selector(nameOfMySelector:) forControlEvents:UIControlEventTouchUpInside]; 

- (void) nameOfMySelector: (id) sender { 
    /* this method would also require the semi-colon */ 
} 
5

Un selettore rappresenta un nome di metodo, e il numero di due punti in un selettore corrisponde al numero di argomenti nel metodo corrispondente:

  1. mySelector - senza due punti, senza argomenti, ad es - (void)mySelector;, [self mySelector];
  2. mySelectorWithFoo: - uno due punti, un singolo argomento, ad es. - (void)mySelectorWithFoo:(Foo *)foo;, [self mySelectorWithFoo:someFoo];
  3. mySelectorWithFoo:withBar: - due punti, due argomenti, ad es. - (void)mySelectorWithFoo:(Foo *)foo bar:(Bar *)bar;, [self mySelectorWithFoo:someFoo bar:someBar];

e così via.

E 'anche possibile avere un selettore senza' nominare 'i parametri. Non è raccomandato in quanto non è immediatamente chiaro quali sono i parametri:

  1. mySelector:: - due punti, due argomenti, per esempio - (void)mySelector:(Foo *)foo :(Bar *)bar;, [self mySelector:someFoo :someBar];
  2. mySelector::: - tre punti, tre argomenti, ad es. - (void)mySelector:(int)x :(int)y :(int)z;, [self mySelector:2 :3 :5];
Problemi correlati