2012-01-04 5 views
6

Probé una aplicación para probar la comunicación bluetooth. Es una aplicación simple que simplemente envía un mensaje en forma de texto de un iDevice a otro. Originalmente, esta aplicación tenía alrededor de 6 advertencias pero arreglé todas menos dos. Son lo mismo, pero tienen que ver con diferentes delegados. Una es para GKPeerPickerControllerDelegate y la otra para GKSessionDelegate. Digamos que el error Selector es para el selector llamado GKPeerPickerController, cuando se escribe (ejemplo más completo a seguir):Un poco de advertencias molestas que todavía permiten que la aplicación funcione, pero me gustaría eliminar

picker.delegate = self; 

el compilador dice:

Pasando '* const ___ fuerte' para el parámetro de tipo incompatible ' carné de identidad'.

Para el GKSession de sesión llamada, escribir

session.delegate = self; 

hace que el compilador dicen:

Envío de 'const * ___ fuerte' para el parámetro de tipo incompatible 'id'.

Estos solo aparecen en el botón para enviar y peerPickerController. Sé que estas advertencias no impiden la capacidad de la aplicación para funcionar, pero me gustaría actualizar esto completamente para Xcode 4.2. Esta aplicación fue escrita originalmente para Xcode cuando iOS 3.0 era nueva. Sí, soy un poco exigente cuando se trata de escribir o practicar código, no debe contener ningún error/advertencia siempre que sea posible.

Estos son los bloques de código, donde ocurre la advertencia:

-(IBAction)btnConnect:(id)sender{ 
    picker = [[GKPeerPickerController alloc] init]; 
    picker.delegate = self; //Warning here 
    picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; 

    [connect setHidden:YES]; 
    [disconnect setHidden:NO]; 
    [picker show]; 
} 

-(void)peerPickerController:(GKPeerPickerController *)PCpicker didConnectPeer:(NSString *)peerID toSession:(GKSession *)session{ 
    self.currentSession = session; 
    session.delegate = self; //Warning here 
    [session setDataReceiveHandler:self withContext:nil]; 
    PCpicker.delegate = nil; 

    [PCpicker dismiss]; 
} 

Editar:

La cabecera tiene esto:

@interface BTViewController : UIViewController{ 
GKSession *currentSession; 
IBOutlet UITextField *txtMessage; 
IBOutlet UIButton *connect; 
IBOutlet UIButton *disconnect; 

GKPeerPickerController *picker; 

}

+1

+1 para tratar de eliminar hasta la última advertencia ** **! –

+0

Gracias, siempre trato de asegurarme de que lo que escribo no tenga problemas. La programación para iOS es diferente de Windows, lo cual también hago para el trabajo. –

+0

código que compila limpio con '-Wall' siempre tiene menos problemas que de lo contrario. –

Respuesta

5

Creo que cualquiera que sea la clase self es posible que no esté adoptando los protocolos formales GKPeerPickerControllerDelegate y GKSessionDelegate. ¿Puedes publicar tu encabezado de interfaz?

EDITAR

La conversión a Identificación borrará las advertencias, pero que realmente no "arreglar" nada ...mirando el encabezado de la clase, no está adoptando los protocolos que esperan los delegados.

Modificar la interfaz de adoptar esos protocolos:

@interface BTViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate> { 
+0

He editado, agregué el encabezado –

+0

Si es posible, ¿cómo podría adoptar los protocolos formales? Esto sería útil para comprender más acerca de la programación para iOS. –

+0

Mi respuesta muestra cómo agregar los protocolos a su clase. Recomiendo leer la guía de Apple para Protocolos para una mayor comprensión - http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html –

3

¿Qué hay de session.delegate = (id)self. Tal vez solo necesites presentarte como ID en lugar de const____strong.

EDITAR: En el legado de la OP, una explicación está en orden. El ID de tipo es necesario para el protocolo, ya que el protocolo en sí mismo está literalmente encasillado en el propio identificador (id<GKSessionDelegate>, etc.). Mi teoría (porque no estoy usando ARC en ninguno de mis proyectos) Es que el compilador se vuelve muy exigente, por lo que puede garantizar que su clase sea segura para su lanzamiento. Probablemente has inicializado tu clase de una forma no idónea ... Por supuesto que no tengo idea de cómo, si alguien sabe; Estaría feliz de dejarlos editar esta respuesta.

EDIT 2: como dijo Teddy, la adopción de los protocolos en el archivo de encabezado también silencia esta advertencia. Me disculpo por pensar que estaba implícito que había adoptado los protocolos.

+1

Eso borró las advertencias. Gracias. ¿Podrías explicar la identificación contra const___strong? –

+0

No creo que esta respuesta corrija correctamente la advertencia ... Consulte mi respuesta. –

+0

Reddy, él está usando ARC. En ARC, su clase probablemente fue instanciada como (no atómica, fuerte). ¿Cómo un encasillamiento no arreglaría eso? Y creo que era bastante obvio que ya se habría conformado con los protocolos. – CodaFi

Cuestiones relacionadas