32

我正在尝试使用 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:方法未在任何地方定义。

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

4

4 回答 4

25

是的你应该。

而不是这样做:

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

你应该做这个:

SEL compareByDeliveryTimeSelector = sel_registerName("compareByDeliveryTime:");
[self.searchResults sortUsingSelector:compareByDeliveryTimeSelector];
于 2013-09-20T15:07:52.563 回答
21

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

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

@protocol DeliveryTimeComparison <NSObject>

- (void)compareByDeliveryTime:(id)otherTime;

@end

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

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

于 2013-10-02T22:47:34.997 回答
15

Xcode 5 默认开启此功能。要关闭它,请转到“Apple LLVM 5.0 - 警告 - 目标 C” -> “未声明的选择器”下的目标的“构建设置”,将其设置为“否”。这应该照顾它。

于 2013-09-11T15:49:29.823 回答
10

MagicalRecord 中的这些选择器警告是为了与 mogenerator 生成的核心数据类兼容。除了使用 mogenerator 并且可能导入其中一个实体之外,除了已经回答的内容之外,您真的无能为力。

当然,另一种选择是用忽略块专门围绕该代码

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

最后

#pragma clang diagnostic pop
于 2014-04-03T00:23:12.463 回答