我正在尝试使用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:
方法未在任何地方定义。
有关如何最好地解决这些类型的错误的任何建议,请提前感谢?!
答案 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