¿Por qué GCC -Wselector y -Wundeclanetworking-selector advierten sobre selectores declarados?

La descripción de las -Wselector de GCC -Wselector y -Wundeclanetworking-selector hacen -Wundeclanetworking-selector herramientas de progtwigción maravillosas para protegerse de los errores tipocharts en las expresiones Objective-C @selector() .

Sin embargo, al habilitarlos en mi base de código, recibo advertencias como esta:

 Unimplemented selector 'reloadData' 

apuntando a líneas como esta:

 [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO]; 

Esta línea de código es bastante común en nuestra base de código. Los datos se cargan de forma asíncrona, y una vez que se carga, la línea de código anterior se utiliza para indicar que UITableView recargue (en el hilo principal, ya que llamar a UIKit desde hilos de background es una mala idea).

Mi pregunta es de múltiples partes:

  1. ¿La línea de código anterior es incorrecta de alguna manera? ¿Hay un patrón mejor para la señalización de UITableView , en el hilo principal, para recargar sus datos?
  2. ¿Por qué GCC advierte sobre esto cuando hay claramente una statement en UITableView.h para el selector de reloadData ?
  3. ¿Hay alguna manera de lograr que GCC advierta sobre los selectores no declarados sin hacer que se queje por los selectores que están claramente declarados?

Sí, soy un fanático de -Wundeclanetworking-selector . No he visto popup este problema. ¿ #import <UIKit/UIKit.h> en este file en particular (o en su .pch)? No puedo reproducir este problema en un progtwig simple con -Wundeclanetworking-selector .

  • Cree un proyecto iOS de vista única con Storyboard
  • Ponga UITableView en la vista principal. Wire to tableView IBOutlet
  • Activar la advertencia "Selector no declarado"
  • Coloque su línea de código en viewDidLoad
  • Construir

Cambie reloadData para reloadData a reloadDat y obtengo la advertencia (como se esperaba):

 Undeclanetworking selector 'reloadDat' 

Dices que obtienes "selector no implementado 'reloadData'". ¿Realmente es la advertencia, o querías escribir "No declarado?"