ios - Должен ли я исправить Xcode 5 «Semantic issue: uneclared selector»?




semantics xcode5 (3)

Xcode 5 по умолчанию включил это. Чтобы отключить его, перейдите в «Настройки сборки» для своей цели в разделе «Apple LLVM 5.0 - Warnings - Objective C» -> «Undeclared Selector» установите значение «NO». Это должно позаботиться об этом.

Я пытаюсь обновить мое приложение с помощью Xcode5, но столкнулся с рядом «семантических проблем» в сторонней библиотеке (будучи MagicalRecord). Самый быстрый способ «исправить» это может быть:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

(от: Как избавиться от предупреждения «необъявленного селектора» )

директиву компилятора, но мое чувство кишки говорит, что это не подходящий способ сделать это. Небольшой образец кода с вышеуказанной ошибкой:

+ (NSEntityDescription *) MR_entityDescriptionInContext:(NSManagedObjectContext *)context {

    if ([self respondsToSelector:@selector(entityInManagedObjectContext:)]) 
    {
        NSEntityDescription *entity = [self performSelector:@selector(entityInManagedObjectContext:) withObject:context];
        return entity;
    }
    else
    {
        NSString *entityName = [self MR_entityName];
        return [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    }
}

где метод entityInManagedObjectContext: не определен нигде.

Любые предложения о том, как лучше всего исправить эти ошибки, заранее!


Вам просто нужно объявить класс или протокол, содержащий селектор. Например:

//  DeliveryTimeComparison.h
#import <Foundation/Foundation.h>

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end

А затем просто #import "DeliveryTimeComparison.h" в любом классе, где вы планируете использовать @selector(compareByDeliveryTime:) .

Или, наоборот, просто импортируйте заголовок класса для любого объекта, который содержит метод compareByDeliveryTime:.


Эти предупреждения о селекторах в MagicalRecord совместимы с классами Core Data, генерируемыми Mogenerator. Помимо использования могенератора и, возможно, импортирования одного из объектов, на самом деле вы не можете многое сделать, кроме того, что уже было ответило.

Другой вариант, конечно, состоит в том, чтобы окружить этот код конкретными блоками игнорирования

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

и в конце

#pragma clang diagnostic pop




xcode5