I get a lot of 'class' may not respond to '-message:' warnings. Should
I strive to remove all these warnings?
Sì, sbarazzarsi degli avvertimenti. Se stai inviando un messaggio a un oggetto, devi essere abbastanza sicuro che l'oggetto, in effetti, ha un metodo con quel nome. Perché non lasciare che anche il compilatore lo sappia? Per lo più, questo significa semplicemente usare i tipi appropriati per i puntatori di oggetti.
Supponiamo di avere un puntatore di tipo UIView*
, ma sai che qualsiasi oggetto su cui il puntatore punterà sarà un'istanza di UIControl
, quindi è sicuro inviare un messaggio come -allTargets
. Funzionerà bene, ma il compilatore avverte che UIView
potrebbe non rispondere a -allTargets
. La soluzione semplice è di cambiare il tipo di puntatore a UIControl*
, poiché sai che sarà sempre il caso comunque.
Un'altra situazione è dove si hanno diversi oggetti di tipi diversi che tutti implementano metodi con lo stesso nome. In tal caso, la modifica del tipo di puntatore non sembra una grande opzione in quanto non si conosce il tipo di oggetto con cui si potrebbe avere a che fare; sai solo che qualsiasi oggetto con cui hai a che fare supporta il messaggio inviato. In tal caso, dichiara un protocollo contenente qualsiasi metodo o metodo che stai inviando e dichiara il puntatore come puntatore a un oggetto che implementa tale protocollo, come:
UIView<MyProtocol> *myPointer;
In entrambi i casi sopra, non si perde alcun dinamismo correggendo l'avviso. Stai solo condividendo con il compilatore la tua conoscenza delle restrizioni che già esistono. Stai anche rendendo il tuo codice più esplicito, il che rende più facile la manutenzione.
La cosa più importante, eliminando questi avvisi facili da correggere, renderà più facile individuare altri avvisi che potrebbero avvisarti di un problema più significativo.
If yes, then what's the benefit of having a dynamic language at your
disposal?
'Dynamic' qui significa solo che la capacità di un oggetto di rispondere a un messaggio non è nota fino al runtime. Se scrivessi, diciamo, C ++, riceverai un errore invece di un avvertimento durante la compilazione perché il compilatore saprebbe per certo che la classe X non implementa il metodo Y. In Objective-C, devi comunque assicurarti che gli oggetti possono rispondere ai messaggi che li invii, ma l'errore che si ottiene se non si riesce a tale riguardo non arriva finché non si esegue il programma.