【问题标题】:Compiler warning when passing NSError ** as a method parameter将 NSError ** 作为方法参数传递时的编译器警告
【发布时间】:2010-05-31 10:26:51
【问题描述】:

在过去的 4 个小时里,我一直在为这个问题摸不着头脑,尝试了各种小实验,但我似乎无法弄清楚出了什么问题。这可能是编译器错误吗?

测试.m:

- (id)initWithContentsOfURL:(NSURL *)aURL error:(NSError **)error
{
    if (!(self = [super init])) {
        return nil;
    }
    return self;
}

main.m:

NSError *error;

Test *t = [[Test alloc] initWithContentsOfURL:[NSURL fileURLWithPath:@"/"] error:&error];

这是编译器警告(来自 main.m):

警告:不兼容的 Objective-C 类型'struct NSError **',预期 'struct NSDictionary **' 传递时 论据 2 'initWithContentsOfURL:错误:'来自 不同的 Objective-C 类型

我正在使用最新版本的 Xcode 和 Snow Leopard。

【问题讨论】:

    标签: objective-c cocoa compiler-warnings compiler-bug


    【解决方案1】:

    我怀疑它选择了另一个选择器实例,initWithContentsOfURL:error: - 可能是NSAppleScript 中的那个。请记住,[NSObject alloc] 返回一个 id

    您的代码在运行时是否按预期工作?

    尝试将[Test alloc] 的返回值转换为Test*

    
    Test *t = [(Test*)[Test alloc] initWithContentsOfURL:[NSURL fileURLWithPath:@"/"] error:&error];
    

    【讨论】:

    • 你是对的。 Objective-C 不喜欢具有相同签名的方法具有不同的类型(即它不进行重载),因此如果两个方法采用不同的参数,请避免将它们命名为相同。
    • 就是这样!谢谢!我不知道 Objective-C 会遇到这些命名空间污染问题。你会认为 Apple 会在 Objective-C 2.0 中解决这个问题...
    • 是的,这很糟糕。不久前我被它咬了:stackoverflow.com/questions/312608/…
    • 说 ObjC 不喜欢具有相同签名的方法具有不同类型就像说 C 不喜欢将 struct * 指针传递给采用 void * 类型的函数。 ObjC 适用于具有相同签名和不同类型的方法(即,不同的类使用相同的选择器但参数类型不同)。在这种情况下,当您使用 id 作为对象类型时,它确实会出现问题,因为它对于“您的意思是哪个”是模棱两可的 - id 意味着它可以同时表示两者。您需要静态键入对象-[(NSRightType *)[NSRightType alloc] init…]
    • 我认为 Graham 可能正在考虑尝试在同一个类上重载一个方法(这里不是这种情况)。
    猜你喜欢
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2018-09-09
    相关资源
    最近更新 更多