Codice Objective C senza preavviso

1

Attualmente sto creando la mia prima app per iPhone in Objective C e ricevo molti avvertimenti perché in molti punti ho approfittato del fatto che l'Objective C è un linguaggio tipizzato in modo dinamico. Ottengo un sacco di 'classe' potrebbe non rispondere a '-message:' avvisi. Dovrei sforzarmi di rimuovere tutti questi avvertimenti? Se sì, qual è il vantaggio di avere una lingua dinamica a tua disposizione?

    
posta Ali Kazmi 12.09.2011 - 09:07
fonte

3 risposte

9

Non posso davvero rispondere alla domanda sull'Obiettivo-C che sia realmente dinamico o meno. Penso che rimanga nel mezzo di un mondo dinamico e statico.

Tuttavia, mantenere gli avvisi è raramente una buona pratica, poiché i veri avvertimenti a cui sei interessato si perdono nel mezzo di molti avvertimenti di cui non ti importa.

Quindi, dovresti sbarazzarti di questi avvertimenti. Ci sono molte cose che puoi fare:

  • disabilita gli avvisi "potrebbe non rispondere" (ma potresti perdere avvisi reali)
  • usa i protocolli (modo abbastanza statico)
  • usa dichiarazioni opzionali nei protocolli (un po 'più "dinamici").
  • usa le dichiarazioni opzionali nelle categorie per NSObject per esempio (anche "più dinamico")
  • usa il metodo "performSelector", che ti dice esplicitamente, il lettore del tuo codice, e il compilatore che chiami "metodo dinamico" "
  • usa id "tipo" ovunque un'istanza debba essere usata in modo non statico

Dichiarazione di non responsabilità: non dico che tutti questi punti sono buone pratiche, ma sono modi tecnici per raggiungere l'obiettivo di eliminare gli avvisi

    
risposta data 12.09.2011 - 09:50
fonte
2

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.

    
risposta data 12.09.2011 - 20:22
fonte
1

Il compilatore Objective-C inserisce automaticamente i cast nel codice binario in cui gli argomenti e i tipi di ritorno sono di tipi diversi (ad esempio numeri interi di dimensioni diverse). Se il compilatore non riesce a capire in modo inequivocabile la firma del metodo che stai usando in fase di compilazione, è possibile che questo non funzioni portando a bug molto bizzarri .

(Questo è il motivo per cui il compilatore ha anche messaggi di avviso speciali per "nessun metodo trovato" e "più metodi trovati", poiché in quei casi è ancora più probabile che si sbagliano)

    
risposta data 12.09.2011 - 22:12
fonte

Leggi altre domande sui tag