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

Я опробовал приложение для проверки связи 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 ответа

Решение

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

РЕДАКТИРОВАТЬ

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

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

@interface BTViewController : UIViewController <GKPeerPickerControllerDelegate, GKSessionDelegate> {

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

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

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

Другие вопросы по тегам