#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>