我应该修复Xcode 5'语义问题:未声明的选择器'吗?

时间:2013-09-02 10:24:47

标签: ios selector semantics xcode5

我正在尝试使用Xcode5升级我的应用,但在第三方库(MagicalRecord)中遇到了许多“语义问题”。 “修复”这个的最快方法可能是使用:

#pragma GCC diagnostic ignored "-Wundeclared-selector"

(来自:How to get rid of the 'undeclared selector' warning

编译器指令,但我的直觉说这不是这样做的合适方式。 带有上述错误的小代码示例:

+ (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:方法未在任何地方定义。

有关如何最好地解决这些类型的错误的任何建议,请提前感谢?!

4 个答案:

答案 0 :(得分:25)

是的,你应该。

而不是这样做:

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

你应该这样做:

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

答案 1 :(得分:20)

您只需要声明包含选择器的类或协议。例如:

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

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end

然后只在您计划使用#import "DeliveryTimeComparison.h"的任何课程中@selector(compareByDeliveryTime:)

或者,只需导入包含“compareByDeliveryTime:”方法的任何对象的类标题。

答案 2 :(得分:15)

Xcode 5默认启用此功能。要关闭它,请转到“Apple LLVM 5.0 - 警告 - 目标C”下的目标“构建设置” - &gt; “Undeclared Selector”将其设置为“NO”。这应该照顾它。

答案 3 :(得分:10)

MagicalRecord中的这些选择器警告是为了与mogenerator生成的Core Data类兼容。除了使用mogenerator并且可能导入其中一个实体之外,除了已经回答的内容之外,你真的做不了多少。

另一种选择当然是专门用忽略块

包围该代码
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"

并在最后

#pragma clang diagnostic pop