2012-01-04 7 views
6

Ho provato un'app per testare le comunicazioni Bluetooth. È una semplice app che invia semplicemente un messaggio in forma di testo da un iDevice all'altro. Originariamente, questa app aveva circa 6 avvisi, ma ho risolto tutti tranne due. Sono gli stessi ma si occupano di diversi delegati. Uno è per GKPeerPickerControllerDelegate e l'altro per GKSessionDelegate. Dire l'errore Picker è per la GKPeerPickerController chiamato selettore, quando si digita (esempio più completo a seguire):Un po 'di fastidiosi avvisi che continuano a far funzionare l'app ma che voglio rimuovere

picker.delegate = self; 

il compilatore dice:

Passando '* const ___ forte' al parametro di tipo incompatibile ' id'.

Per il nome della sessione GKSession, digitando

session.delegate = self; 

rende il compilatore dicono:

Invio '* const ___ forte' al parametro di tipo incompatibile 'id'.

Questi compaiono solo nel pulsante per inviare e peerPickerController. So che questi avvertimenti non impediscono la capacità di funzionamento dell'app, ma vorrei aggiornarlo completamente per Xcode 4.2. Questa app è stata originariamente scritta per Xcode quando iOS 3.0 era nuovo. Sì, sono un po 'schizzinoso quando si tratta di scrivere o praticare codice, non deve contenere errori/avvertenze quando possibile.

Questi sono i blocchi di codice in cui si verificano l'avvertimento:

-(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]; 
} 

Edit:

L'intestazione ha questo:

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

GKPeerPickerController *picker; 

}

+1

+1 per aver tentato di rimuovere ogni ultimo avvertimento ** **! –

+0

Grazie, cerco sempre di assicurarmi che ciò che scrivo non abbia problemi. La programmazione per iOS è diversa da Windows, che faccio anche per lavoro. Il codice –

+0

che compila clean con '-Wall' ha sempre meno problemi di altri. –

risposta

5

Credo che qualsiasi classe self non stia adottando i protocolli formali GKPeerPickerControllerDelegate e GKSessionDelegate. Puoi pubblicare l'intestazione dell'interfaccia?

EDIT

Casting per id cancellerà gli avvertimenti, ma davvero non "fissare" nulla ...guardando l'intestazione della classe, non sta adottando i protocolli che i delegati si aspettano.

Gestire l'interfaccia di adottare i protocolli:

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

Ho modificato, ho aggiunto l'intestazione per esso –

+0

Se possibile, come adotterebbe i protocolli formali? Ciò sarebbe utile per comprendere meglio la programmazione per iOS. –

+0

La mia risposta mostra come aggiungere i protocolli alla classe. Raccomando di leggere la guida Apple ai protocolli per ulteriori informazioni: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html –

3

Che dire session.delegate = (id)self. Forse hai solo bisogno di lanciare se stessi come ID invece di const____strong.

MODIFICA: Al lascito dell'OP, una spiegazione è in ordine. L'id del tipo è necessario per il protocollo, perché il protocollo stesso è letteralmente convertito in id (stesso) (id<GKSessionDelegate> ecc.). La mia teoria (perché non sto usando ARC in nessuno dei miei progetti) è che il compilatore diventa molto esigente in modo che possa garantire che la tua classe sia sicura per il rilascio. Probabilmente hai inizializzato la tua classe in modo non-id ... Ovviamente non ho idea di come, se qualcuno lo sa; Sarei felice di lasciargli modificare questa risposta.

MODIFICA 2: come ha detto Teddy, anche l'adozione dei protocolli nel file di intestazione fa tacere questo avviso. Mi scuso per aver pensato che fosse implicito che avevi adottato i protocolli.

+1

Questo ha cancellato gli avvertimenti. Grazie. Potresti spiegare l'ID contro const___strong? –

+0

Non penso che questa risposta corregge correttamente l'avviso ... per favore vedi la mia risposta. –

+0

Reddy, sta usando ARC. In ARC, la sua classe è stata probabilmente istanziata come (non anatomica, forte). Come potrebbe un typecast non risolverlo? E penso che fosse abbastanza ovvio che si sarebbe già conformato ai protocolli. – CodaFi

Problemi correlati