присваивание себя CLLocationManager.delegate генерирует предупреждение о несовместимом типе - PullRequest
5 голосов
/ 07 апреля 2011

Приложение, над которым я работаю в течение некоторого времени без ошибок сборки, после обновления до xCode 4 выдает предупреждение о несовместимом типе для последней строки этого кода ...

locationManager = [[CLLocationManager alloc] init];
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
locationManager.delegate = self;

Самое забавное, что после очистки и сборки xCodes не сообщает о проблемах. Однако, если я перейду к классу, содержащему этот код, ошибка сборки внезапно появится и останется, пока я снова не выполню очистку.

фактическое предупреждение ...

предупреждение: семантическая проблема: несовместимые типы указателей, присваиваемые «id» из «Class»

CLLocationmanager работает нормально, и мои методы-делегаты вызываются так, что все работает нормально. Я хотел бы избавиться от этого предупреждения. Должен ли я просто игнорировать это?

Ответы [ 5 ]

24 голосов
/ 07 апреля 2011

Вы объявили, что ваш объект делегата следует протоколу CLLocationManagerDelegate? Обычно я делаю это в расширении класса вместо файла заголовка для MyObject.

@interface MyObject()<CLLocationManagerDelegate> 
@end

или в Swift

@objc class MyObject: NSObject, CLLocationManagerDelegate
{
// implement whichever of the optional protocol functions you need
}
4 голосов
/ 07 апреля 2011

Несоответствующие предупреждения кажутся ошибкой.Но реальный вопрос заключается в том, был ли класс self в приведенном выше коде объявлен как реализующий протокол CLLocationManagerDelegate.Если вы реализуете правильные методы, он будет работать независимо от того, как он объявлен.Но если объявление класса не включает в себя <CLLocationManagerDelegate>, то компилятор будет жаловаться.Если у вас этого нет, то исправление объявления класса должно исправить предупреждение.

3 голосов
/ 07 апреля 2011

Я думаю, вы должны подать отчет об ошибке в Apple, и пока они не сделают что-то с этим, я думаю, все, что вы можете сделать, это проигнорировать.

2 голосов
/ 18 сентября 2014

У меня такая же ситуация.

добавьте строку ниже, тогда предупреждающее сообщение исчезнет.

#import <CoreLocation/CLLocationManagerDelegate.h>
2 голосов
/ 29 июля 2014

Я думаю, вам нужно добавить CLLocationManagerDelegate в ваш файл .h как

@interface MyViewController : UIViewController <CLLocationManagerDelegate>
...