我应该修复 Xcode 5 的“语义问题:未声明的选择器”吗?
Posted
技术标签:
【中文标题】我应该修复 Xcode 5 的“语义问题:未声明的选择器”吗?【英文标题】:Should I fix Xcode 5 'Semantic issue: undeclared selector'? 【发布时间】:2013-09-05 10:13:54 【问题描述】:我正在尝试使用 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:
方法未在任何地方定义。
关于如何最好地解决这些类型的错误的任何建议,在此先感谢?!
【问题讨论】:
【参考方案1】:是的,你应该这样做。
而不是这样做:
[self.searchResults sortUsingSelector:@selector(compareByDeliveryTime:)];
你应该这样做:
SEL compareByDeliveryTimeSelector = sel_registerName("compareByDeliveryTime:");
[self.searchResults sortUsingSelector:compareByDeliveryTimeSelector];
【讨论】:
谢谢。这也消除了我在提交过程中收到的“应用程序引用了有效负载中的非公共选择器”警告。如上所述声明选择器后,我能够在没有任何警告的情况下提交应用程序。 知道为什么会切换默认构建设置吗?打电话给sel_registerName
(因此明确registering a method with the Objective-C runtime
)会给你带来什么(除了额外的线)?
在我看来,这并没有修复警告,它只是隐藏了它。正确修复它应该包括包含声明选择器的文件,因为如果该选择器由于某种原因被重命名,警告将再次出现,这是我们应该想要的。
我想我记得当 64 位 ARM 的东西进来时,我读过一些关于这个的东西。不过我现在找不到文档。
这里有一些相关的东西:***.com/questions/7017281/…【参考方案2】:
你只需要声明一个包含选择器的类或协议。例如:
// DeliveryTimeComparison.h
#import <Foundation/Foundation.h>
@protocol DeliveryTimeComparison <NSObject>
- (void)compareByDeliveryTime:(id)otherTime;
@end
然后只需在您计划使用@selector(compareByDeliveryTime:)
的任何课程中使用#import "DeliveryTimeComparison.h"
。
或者,只需导入包含“compareByDeliveryTime:”方法的任何对象的类头。
【讨论】:
我同意上述方法,因为关闭警告不是我首选的“修复”方式。使用适当的头文件和类/协议名称,我可以更轻松地找到这个记录在案的“快速修复”。所以暂时我想我会采用Abhi的方法。 这听起来不错,除非你不能真正包含/导入选择器应该在的类(循环依赖问题,..)【参考方案3】:Xcode 5 默认开启此功能。要关闭它,请转到“Apple LLVM 5.0 - 警告 - 目标 C” -> “未声明的选择器”下的目标的“构建设置”,将其设置为“否”。这应该会解决它。
【讨论】:
这并没有回答有关如何修复警告的问题,而是防止警告发生.. -1 ! 同意。但是对于我们这些需要解决更大的 ios 7 问题的人来说,这允许您隐藏这些问题,直到您以后可以处理它们。提交带有这些警告的应用程序也不会出现问题。【参考方案4】:MagicalRecord 中的这些选择器警告是为了与 mogenerator 生成的 Core Data 类兼容。除了使用 mogenerator 和可能导入其中一个实体之外,除了已经回答的内容之外,您确实无能为力。
当然,另一种选择是用忽略块专门围绕该代码
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wundeclared-selector"
最后
#pragma clang diagnostic pop
【讨论】:
以上是关于我应该修复 Xcode 5 的“语义问题:未声明的选择器”吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 Xcode 4.5 中查找 CDVViewController.m 的位置
Xcode: 如何修复线程 5: EXC_BREAKPOINT (code=1, subcode=0x10025c76c)