2011-04-15 13 views
6

Xcode 4 me está dando advertencias de compilación en el mensaje performSelectorOnMainThread:withObject:waitUntilDone: enviado a mi delegado y no lo consigo.¿Por qué mi delegado no aceptará performSelectorOnMainThread: withObject: waitUntilDone :?

Mi delegado se declara como:

@property (nonatomic, assign) id <AccountFeedbackDelegate> delegate; 

Y luego finalmente ejecutado en el hilo principal:

[self.delegate performSelectorOnMainThread:@selector(didChangeCloudStatus) withObject:nil waitUntilDone:NO]; 

embargo Xcode persiste en darme:

advertencia: Semántica Problema: Método '-performSelectorOnMainThread: withObject: waitUntilDone:' no encontrado (el tipo de retorno está predeterminado en 'i d ')

Por supuesto, el código se compila y funciona bien, pero no me gusta la advertencia. Cuando redeclare el delegado de esta manera, el aviso se desvanece, pero no me gusta la solución:

@property (nonatomic, assign) NSObject <AccountFeedbackDelegate> *delegate; 

¿Qué me falta? ¿Qué hice mal? Cheers,
EP

Respuesta

19

performSelectorOnMainThread:withObject:waitUntilDone: se declara en una categoría en NSObject en NSThread.h. Como su variable es del tipo id, el compilador no puede estar seguro de que pueda responder a un mensaje definido para NSObject. Y a diferencia de las variables simples id, el compilador le advierte al respecto cuando su variable se declara id <SomeProtocol>.

Por lo tanto, debe declarar a su delegado como NSObject <AccountFeedbackDelegate>.

PD: La forma "estándar" de deshacerse de este tipo de advertencia declarando el protocolo como @protocol AccountFeedbackDelegate <NSObject> no funcionará aquí porque performSelectorOnMainThread:withObject:waitUntilDone: no está declarado en el protocolo NSObject.

+1

Gracias por eso @Ole, eso de hecho lo explica. Seguiré declarando el delegado con id, pero lo lanzaré a NSObject antes de llamar al método 'performSelectorOnMainThread: withObject: waitUntilDone:'. – epologee

+1

NSObject * propertyName – cynistersix

Cuestiones relacionadas