我应该修复 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)

Xcode 项目打不开

Xcode 5 - 失控的 CPU 和内存使用

编辑后 UITextField 上的 Xcode 5 字体大小错误

更新 Xcode 12 后如何修复操作按钮?