Подтвердить что ты не робот

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

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

#pragma GCC diagnostic ignored "-Wundeclared-selector"

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

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

+ (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: не определен нигде.

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

4b9b3361

Ответ 1

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

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

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end

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

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

Ответ 2

Да, вы должны.

вместо этого:

[self.searchResults sortUsingSelector:@selector(compareByDeliveryTime:)];

вы должны сделать это:

SEL compareByDeliveryTimeSelector = sel_registerName("compareByDeliveryTime:");
[self.searchResults sortUsingSelector:compareByDeliveryTimeSelector];

Ответ 3

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

Ответ 4

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

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

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

и в конце

#pragma clang diagnostic pop