Немного раздражающих предупреждений, которые все еще позволяют приложению работать, но хотели бы удалить
Я опробовал приложение для проверки связи 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: как сказал Тедди, принятие протоколов в вашем заголовочном файле также заставляет замолчать это предупреждение. Я прошу прощения за то, что подумал, что это означало, что вы приняли протоколы.