2012-01-11 19 views
5

Perché ricevo questo avvertimento nel mio codice qui sotto:metodi multipli chiamati 'tag' trovato

- (IBAction)shareThisActionSheet:(id)sender 
{ 
    int row = [sender tag]; //warning is here! Multiple methods named 'tag' found 
    ... 

risposta

12

Descrizione

Il problema è che il compilatore vede più di un metodo denominato tag in th L'unità di traduzione corrente e queste dichiarazioni hanno tipi di ritorno diversi. Uno è probabile che sia -[UIView tag], che restituisce un NSInteger. Ma è anche visto un'altra dichiarazione di tag, forse:

@interface MONDate 
- (NSString *)tag; 
@end 

poi il compilatore vede un'ambiguità - è sender un UIView? o è un MONDate?

Il compilatore ti avverte che deve indovinare il tipo di sender è. Questo è davvero chiedere un comportamento indefinito.

Risoluzione

Se si conosce il tipo di parametri, quindi specificare che:

altro, usare qualcosa come una condizione isKindOfClass: per determinare il tipo di dichiarare la variabile come prima messaggistica che . come mostrano altre risposte, potresti anche digitare.

+1

+1 molto ben spiegato. Ma dovrebbe funzionare in ogni caso (usando id), nonostante l'avvertimento .. giusto? –

+0

@Ankit It * non funzionerà (ref: chiede un comportamento indefinito). Se tutti i metodi visibili 'tag' restituiscono un oggetto objc, è prevedibile. Se si restituisce un 'CGRect' e l'altro un oggetto objc, il compilatore potrebbe finire per chiamare la variante' objc_msgSend' sbagliata e si può distruggere una parte dello stack. Se il compilatore indovina l'altro modo ed è sbagliato, il 'CGRect' può essere inviato come oggetto objc. Si potrebbe anche tagliare la memoria, e se C++ è lì, è ancora più complesso. (segue) – justin

+0

(segue) L'alternativa sarebbe guardare l'insieme generato, per ogni avviso generato. Cosa è peggio? Non puoi ricevere l'avviso se non hai #incluso il tipo di oggetto che è passato come 'sender' nella TU. – justin

3

Il problema è che sender è definito come un oggetto (id). Al momento della compilazione, xcode non sa quale tipo di oggetti saranno passati alla tua funzione.

Se si scrive questa funzione per un tipo oggetto specifico, si potrebbe si potrebbe scrivere per esempio

- (IBAction)shareThisActionSheet:(UIButton*)sender 

o si potrebbe accennare al compilatore il tipo di oggetto con la chiamata

int row = [(UIButton*)sender tag]; 
2

Bastian è giusto si dovrebbe convertire il mittente di questo pulsante mi piace:

UIButton * button = (UIButton *)sender; 
int row = button.tag; 
+3

se pensi che io abbia ragione, perché pubblichi la stessa risposta invece di invadere il mio? – Bastian

+1

Perché ho postato un casting leggermente diverso di mittente (penso che sia più corretto perché è più visivo) – Stas

Problemi correlati