在try 确定传入的对象的类型时,我收到以下编译器警告:

消息传递不合格ID

这是对大型Prod代码库中情况的简化:

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [ViewController myMethod:@"MyString"];
    
    [ViewController myMethod:@[@(1), @(2), @(3)]];
    
    [ViewController myMethod:@(13)];
}

+ (void)myMethod:(id)authenticationData {
    if ([authenticationData isKindOfClass:[NSArray class]]) { // ERROR: 消息传递不合格ID
        NSLog(@"NSArray");
    } else if ([authenticationData isKindOfClass:[NSString class]]) { // No error here because the compiler stops checking after the first one. If above statement is commented out --> same error here
        NSLog(@"NSString");
    } else {
        NSLog(@"Unknown");
    }
}

@end

推荐答案

该警告是由项目中的-Wobjc-messaging-id引起的.该标志几乎是可选的(对于我的所有项目,它在默认情况下都是禁用的),所以如果您需要在不进行编译器分析的情况下调用id对象,则可以禁用它.

如果出于任何原因无法禁用该标志,您应该使对象接口对编译器是明显的(这样它就可以看到您调用它的对象的方法).由于isKindOfClass:属于NSObject协议,这是您需要为authenticationData参数引入的最小类型,以消除警告:

+ (void)myMethod:(id<NSObject>)authenticationData

Objective-c相关问答推荐

Objective C 中的 RSA 实现

uipageviewcontroller 类在设置多个视图控制器时崩溃

Objective-c 点表示法或方括号表示法中首选什么?

是否可以 suppress Xcode 4 静态分析器警告?

Xcode 是否支持区域?

为什么在目标 c 的静态上下文中允许 self

pathForResource 返回 null

iOS performSelectorOnMainThread 有多个参数

UISearchbar 键盘搜索按钮操作

lldb 无法打印变量值并显示错误:对 'id' 的引用不明确

Interface Builder 中的 IBOutletCollection 集排序

强制iphone应用程序以编程方式重新启动?

从 NSMutableString 中删除最后一个字符

Cocoa 与 Cocoa Touch - 有什么区别?

代码问题:格式字符串不是字符串文字

在 32 位和 64 位架构上格式化 NS(U)Integer 时类型转换的替代方法?

Objective-C 中的非正式协议?

如何在今天午夜获取 NSDate 对象?

如何在 Xcode 7 中启用_BITCODE?

如何在 iPhone SDK 中包含和使用新字体?