Немного раздражающих предупреждений, которые все еще позволяют приложению работать, но хотели бы удалить - PullRequest
6 голосов
/ 04 января 2012

Я опробовал приложение для проверки связи Bluetooth.Это простое приложение, которое просто отправляет сообщение в текстовом виде от одного iDevice к другому.Первоначально в этом приложении было около 6 предупреждений, но я исправил все, кроме двух.Они одинаковы, но имеют дело с разными делегатами.Один для GKPeerPickerControllerDelegate, а другой для GKSessionDelegate.Скажем, ошибка Picker связана с именованным средством выбора GKPeerPickerController, когда вы набираете (более полный пример для подражания):

picker.delegate = self;

компилятор говорит:

Передача * const ___ strongпараметр несовместимого типа 'id'.

Для сеанса с именем GKSession, набрав

session.delegate = self;

, компилятор скажет:

Отправка '*const___strong к параметру несовместимого типа id.

Они появляются только в кнопках отправки и peerPickerController.Я знаю, что эти предупреждения не препятствуют функционированию приложения, но я хотел бы полностью обновить это для Xcode 4.2.Это приложение было изначально написано для Xcode, когда iOS 3.0 была новой.Да, я немного придирчив, когда дело доходит до написания или отработки кода, он не должен содержать ошибок / предупреждений, когда это возможно.

Это блоки кода, в которых возникает предупреждение:

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

Редактировать:

В заголовке есть это:

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

GKPeerPickerController *picker;

}

Ответы [ 2 ]

5 голосов
/ 04 января 2012

Я полагаю, что какой бы класс self не принимал формальные протоколы GKPeerPickerControllerDelegate и GKSessionDelegate. Вы можете опубликовать свой заголовок интерфейса?

EDIT

Преобразование в id удалит предупреждения, но вы действительно ничего не "исправили" ... глядя на заголовок класса, он не принимает протоколы, ожидаемые делегатами.

Измените ваш интерфейс для принятия этих протоколов:

@interface BTViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate> {
3 голосов
/ 04 января 2012

Как насчет session.delegate = (id)self. Может быть, вам просто нужно использовать себя как удостоверение личности вместо константы ____ сильной.

РЕДАКТИРОВАТЬ: По завещанию OP, объяснение в порядке. Тип ID необходим для протокола, потому что сам протокол буквально typecast для самого ID (id<GKSessionDelegate> и т. Д.). Моя теория (потому что я не использую ARC ни в одном из моих проектов) заключается в том, что компилятор становится очень требовательным, чтобы гарантировать безопасность вашего класса для выпуска. Вы, вероятно, инициализировали свой класс без идентификатора ... Конечно, я понятия не имею, как, если кто-то знает; Я был бы рад позволить им редактировать этот ответ.

РЕДАКТИРОВАТЬ 2: как сказал Тедди, принятие протоколов в вашем заголовочном файле также заставляет замолчать это предупреждение. Я прошу прощения за то, что подумал, что это означало, что вы приняли протоколы.

...