2012-01-04 10 views
6

Wypróbowałem aplikację, aby przetestować komunikację bluetooth. Jest to prosta aplikacja, która po prostu wysyła wiadomość w formie tekstowej z jednego iDevice do drugiego. Oryginalnie ta aplikacja miała około 6 ostrzeżeń, ale naprawiłem wszystkie oprócz dwóch. Są takie same, ale mają do czynienia z różnymi delegatami. Jeden jest dla GKPeerPickerControllerDelegate, a drugi dla GKSessionDelegate. Wypowiedz błąd Picker jest dla GKPeerPickerController nazwie kompletacji, po wpisaniu (pełniejszy przykład do naśladowania):Trochę denerwujących ostrzeżeń, które nadal pozwalają aplikacji działać, ale chcą usunąć

picker.delegate = self; 

kompilator mówi:

Passing '* const ___ silny' do parametru niezgodnego typu ' ID'.

Dla nazwie sesji GKSession, wpisując

session.delegate = self; 

sprawia kompilator powiedzieć:

Wysyłanie '* const ___ silny' do parametru niezgodnego typu 'id'.

Te tylko pop w przycisku, aby wysłać i peerPickerController. Wiem, że te ostrzeżenia nie przeszkadzają w funkcjonowaniu aplikacji, ale chciałbym ją całkowicie zaktualizować w Xcode 4.2. Ta aplikacja została pierwotnie napisana dla Xcode, gdy system iOS 3.0 był nowy. Tak, jestem trochę wybredny, jeśli chodzi o pisanie lub ćwiczenie kodu, nie może on zawierać żadnych błędów/ostrzeżeń, kiedy tylko jest to możliwe.

Są to bloki kodu, gdzie występują ostrzeżenie:

-(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:

Nagłówek ma to:

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

GKPeerPickerController *picker; 

}

+1

+1 dla próbuje usunąć każdą ostatnią ** Uwaga **! –

+0

Dzięki, zawsze staram się upewnić, że to, co piszę, nie ma problemów. Programowanie dla iOS jest inne niż Windows, co też robię w pracy. –

+0

kod, który kompiluje się czysto z '-Wall' zawsze ma mniej problemów niż w innych przypadkach. –

Odpowiedz

5

Wierzę, że każda klasa self może nie przyjmować formalnych protokołów GKPeerPickerControllerDelegate i GKSessionDelegate. Czy możesz opublikować swój nagłówek interfejsu?

EDIT

Casting do id usunie ostrzeżenia, ale na pewno nie "naprawić" nic ...patrząc na nagłówek klasy, nie przyjmuje protokołów, których oczekują delegaci.

Modyfikacja interfejsu przyjąć te protokoły:

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

Edytowałem, dodałem nagłówek do niego –

+0

Jeśli to możliwe, w jaki sposób przyjęłoby formalne protokoły? Byłoby to pomocne w lepszym zrozumieniu programowania na iOS. –

+0

Moja odpowiedź pokazuje, jak dodać protokoły do ​​klasy. Polecam przeczytanie Przewodnika po protokołach Apple w celu lepszego zrozumienia - http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html –

3

Co o session.delegate = (id)self. Być może wystarczy rzucić siebie jako ID zamiast const____strong.

EDYCJA: Przy zapisie PO należy podać wyjaśnienie. Identyfikator type jest konieczny dla protokołu, ponieważ sam protokół jest dosłownie typecast do samego identyfikatora (id<GKSessionDelegate> itd.). Moja teoria (ponieważ nie używam ARC w żadnym z moich projektów) Jest to, że kompilator jest bardzo wymagający, więc może zagwarantować, że twoja klasa jest bezpieczna do wydania. Prawdopodobnie zainicjowałeś swoją klasę w sposób inny niż ID ... Oczywiście nie mam pojęcia, jak, jeśli ktokolwiek wie; Z przyjemnością pozwolę im edytować tę odpowiedź.

EDYCJA 2: jak powiedział Teddy, przyjęcie protokołów w pliku nagłówkowym również wycisza to ostrzeżenie. Przepraszam za myślenie, że to sugerowało, że przyjęliście protokoły.

+1

To wyczyściło ostrzeżenia. Dziękuję Ci. Czy mógłbyś wytłumaczyć ID kontra const___strong? –

+0

Nie sądzę, że ta odpowiedź poprawnie naprawia ostrzeżenie ... zobacz moją odpowiedź. –

+0

Reddy, on używa ARC. W ARC jego klasa była prawdopodobnie tworzona jako (nieatomowa, silna). W jaki sposób typografię to nie naprawi? I myślę, że było całkiem oczywiste, że już byłby zgodny z protokołami. – CodaFi