Search code examples
iosselectorsemanticsxcode5

Should I fix Xcode 5 'Semantic issue: undeclared selector'?


I'm trying to upgrade my app with Xcode5 but encountered a number of 'Semantic issues' in a third party library (being MagicalRecord). The quickest way to 'fix' this might be using the:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

(from: How to get rid of the 'undeclared selector' warning)

compiler directive, but my gut-feeling says this is not the appropriate way to do this. A small code sample with the above error:

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

where the entityInManagedObjectContext: method is not defined anywhere.

Any suggestions on how to best fix these types of errors, thanks in advance?!


Solution

  • You just need to declare a class or protocol that contains the selector. For example:

    //  DeliveryTimeComparison.h
    #import <Foundation/Foundation.h>
    
    @protocol DeliveryTimeComparison <NSObject>
    
    - (void)compareByDeliveryTime:(id)otherTime;
    
    @end
    

    And then simply #import "DeliveryTimeComparison.h" in any class where you plan to use @selector(compareByDeliveryTime:).

    Or alternatively, just import the class header for any object that contains a "compareByDeliveryTime:" method.