2012-11-21 15 views
7

Prima di ARC, ho avuto un "X potrebbe non rispondere a xxx" avviso, che è un avviso piuttosto innocuo che non impedisce di compilare. Ora, sto cercando di convertire il mio progetto in ARC, e ho un "Nessuna interfaccia visibile per X dichiara il selettore xxx" errore, che impedisce la compilazione.Come ignorare "Nessuna interfaccia @ visibile per X dichiara il selettore"?

So esattamente cosa sto facendo, e perché l'avviso era lì, e posso dirti che il programma è corretto. In precedenza, il compilatore lo compilava senza problemi e non dovrebbe ora impedirne la compilazione.

E 'vero che l'interfaccia di classe di X non dichiara che il selettore, ma X è una classe che gestisce dinamicamente qualsiasi messaggio con qualsiasi selettore inviato ad esso, utilizzando forwardInvocation: (che è una delle cose belle su Objective-C), quindi la sua interfaccia non può dichiarare tutti i selettori che possono essere chiamati su di esso. E il selettore è dichiarato da qualche parte, non solo su X.

+0

La documentazione dicono: "Per rispondere ai metodi che l'oggetto non si riconosce, è necessario eseguire l'override di methodSignatureForSelector: "L'hai fatto? – rdelmar

+0

Forse questa risposta potrebbe aiutarti. http://stackoverflow.com/a/8002646/1341136 – hanjae

+0

@rdelmar: No, questo è un errore in fase di compilazione. Niente a che vedere con il suo funzionamento in runtime (che funziona bene) – user102008

risposta

5

So esattamente quello che sto facendo, e perché l'avvertimento era lì, e posso dirvi che il programma è corretto.

OK - Basta usare objc_msgSend et al. direttamente se vuoi fare il lavoro del compilatore.

E 'vero che l'interfaccia di classe di X non dichiara che il selettore, ma X è una classe che gestisce in modo dinamico qualsiasi messaggio con qualsiasi selettore inviato ad esso, utilizzando forwardInvocation: (che è una delle cose belle di Objective- C), quindi la sua interfaccia non può dichiarare tutti i selettori che possono essere chiamati su di esso. E il selettore è dichiarato da qualche parte, non solo su X.

Se è troppo noioso per dichiarare, ma non abbastanza da utilizzare nella messaggistica che sembra contraddire l'uso del vostro programma del selettore noiosa ... Suona come il territorio pericoloso di generato codice con significativo intervento umano.

Forse dovresti prendere in considerazione la dichiarazione di un protocollo in modo che il compilatore possa almeno impostare correttamente il messaggio per te, e se cambi o interrompi qualcosa, ha la possibilità di adattarsi o notificarti.

2

Non ne sono sicuro, ma credo che con ARC sia più importante che il compilatore possa vedere una firma del metodo, perché ha bisogno di sapere quale gestione della memoria è necessaria. Così potrete sia necessario:

  1. dichiarare i metodi che si sta utilizzando tramite uno dei metodi normali (cioè in posizione ideale sul ricevitore vero e proprio, ma se non altro come una categoria, anche se solo su NSObject).
  2. Fai le cose manualmente tramite NSInvocation o altri mezzi simili, assumendoti la piena responsabilità per la gestione della memoria (che può essere complicato, in quanto dovrai fare il ponte da e verso ARC).

Aggiornamento: Ho appena controllato la fonte clang, e questo è davvero il caso - è bisogno la firma quando si utilizza ARC. Non sta solo cercando di essere cattivo.:)

1

E 'vero che l'interfaccia di classe di X non dichiara che il selettore, ma X è una classe che gestisce in modo dinamico qualsiasi messaggio con qualsiasi selettore inviato ad esso, utilizzando forwardInvocation: (che è una delle cose belle Objective-C), quindi la sua interfaccia non può dichiarare tutti i selettori che possono essere chiamati su di esso. E il selettore viene dichiarato da qualche parte, solo non su X.

Trasmetti l'ID se si desidera eliminare le informazioni di tipo statico. O se il tuo oggetto è un proxy per un'altra classe, magari cast per quella classe.

Fintanto che il metodo viene dichiarato da qualche parte in un'intestazione (che comunque deve essere il caso) e non vi è alcuna ambiguità con i tipi di argomento, questo dovrebbe correggere l'errore.

Se siete interessati a perché questo è solo un problema con abilitato ARC, controllare la risposta a questa domanda ho chiesto: Why is 'no known method for selector x' a hard error under ARC?

+0

Questo non è sempre possibile. Ad esempio, se questo è un messaggio per 'super', non è possibile" castare id ". – user102008

Problemi correlati