web-dev-qa-db-fra.com

Dois-je corriger Xcode 5 'Problème sémantique: sélecteur non déclaré'?

J'essaie de mettre à niveau mon application avec Xcode5 mais j'ai rencontré un certain nombre de `` problèmes sémantiques '' dans une bibliothèque tierce (étant MagicalRecord). Le moyen le plus rapide de "corriger" cela pourrait être d'utiliser:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

(from: Comment se débarrasser de l'avertissement 'sélecteur non déclaré' )

directive du compilateur, mais mon intuition dit que ce n'est pas la façon appropriée de le faire. Un petit exemple de code avec l'erreur ci-dessus:

+ (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];
    }
}

où la méthode entityInManagedObjectContext: n'est définie nulle part.

Des suggestions sur la meilleure façon de corriger ces types d'erreurs, merci d'avance?!

31
iOS-Coder

Il vous suffit de déclarer une classe ou un protocole contenant le sélecteur. Par exemple:

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

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end

Et puis simplement #import "DeliveryTimeComparison.h" Dans n'importe quelle classe où vous prévoyez d'utiliser @selector(compareByDeliveryTime:).

Ou bien, importez simplement l'en-tête de classe pour tout objet qui contient une méthode "compareByDeliveryTime:".

20
Abhi Beckert

Oui tu devrais.

au lieu de faire ceci:

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

vous devriez faire ceci:

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

Xcode 5 a activé cette option par défaut. Pour le désactiver, allez dans "Paramètres de construction" pour votre cible sous "Apple LLVM 5.0 - Avertissements - Objectif C" -> "Sélecteur non déclaré", réglez-le sur "NON". Cela devrait en prendre soin.

15
Jason Shehane

Ces avertissements de sélecteur dans MagicalRecord sont pour la compatibilité avec les classes Core Data générées par mogenerator. En plus d'utiliser mogenerator et peut-être d'importer l'une des entités, vous ne pouvez vraiment pas faire grand-chose à part ce qui a déjà été répondu.

Une autre option est bien sûr d'entourer ce code spécifiquement avec des blocs ignorer

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

et à la fin

#pragma clang diagnostic pop
10
Keyd