присвоение self CLLocationManager.delegate генерирует предупреждение о несовместимом типе

#iphone #xcode #warnings #cllocationmanager

#iPhone #xcode #предупреждения #cllocationmanager

Вопрос:

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

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

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

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

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

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

Ответ №1:

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

 @interface MyObject()<CLLocationManagerDelegate> 
@end
  

или в Swift

 @objc class MyObject: NSObject, CLLocationManagerDelegate
{
// implement whichever of the optional protocol functions you need
}
  

Ответ №2:

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

Комментарии:

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

2. Вызов методов делегата не имеет никакого отношения к тому, объявлен ли класс как реализующий протокол — время выполнения будет динамически определять, доступен ли метод, а объявление имеет значение только во время компиляции. Если вы объявили протокол, я думаю, нам понадобится больше кода, чтобы быть уверенными в том, что происходит.

Ответ №3:

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

Комментарии:

1. в моем случае это решено, я добавляю протокол CLLicarionManagerDelegate @interface SZChechInViewController ()<CLLocationManagerDelegate>

Ответ №4:

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

 @interface MyViewController : UIViewController <CLLocationManagerDelegate>
  

Ответ №5:

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

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

 #import <CoreLocation/CLLocationManagerDelegate.h>