【问题标题】:Obj-C Assignment Warning With Init Method带有 Init 方法的 Obj-C 赋值警告
【发布时间】:2009-07-16 17:24:06
【问题描述】:

我有一个init方法定义为:

- (id)initWithX:(float)inX AndY:(float)inY
{
    if (self = [super init])
    {
        [self setX:inX andY:inY];
    }

    return self;    
}

当我像这样使用这种方法时:

MyObject* myObject = [[MyObject alloc] initWithX:0.0 AndY:0.0];

我收到一条警告:“警告:从不同的 Objective-C 类型初始化”

但有趣的是,如果我在方法签名中将“AndY:”更改为“andY:”,警告就会消失。

为什么会发生这种情况?当然我的方法的命名不应该影响它的返回类型??


经过一番调查,使用小写“andY”更改方法名称并没有使警告消失。我清理了所有目标,然后重建,警告没有显示。但它在另一次重新编译后又回来了。奇怪。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    如果没有完整的代码上下文,这有点模糊,但我会尝试回答您的问题。

    方法选择器的命名不应影响其返回类型。但是,如果方法名称不匹配(例如,它在@interface 中称为-initWithX:andY:,但在@implementation 中称为-initWithX:AndY:),您可能会遇到奇怪的问题。顺便说一句,多部分选择器的 Cocoa 约定是每个片段都以小写字母开头。

    【讨论】:

    • 另外,顺便提一下,Apple 的编码指南从使用“and”连接参数开始,如 andY:(int)intY “不要使用“and”连接作为接收者属性的关键字。 " developer.apple.com/documentation/Cocoa/Conceptual/…
    • 一个很好的观点!我忘记了,但这是很好的建议。
    • 这是我检查的第一件事,但这不是问题。接口中的声明与实现中的定义完美匹配。接口中使用的方法签名为:- (id)initWithX:(float)x AndY:(float)y;
    【解决方案2】:

    您是否在 .h 文件中使用小写“and”声明它?

    【讨论】:

      【解决方案3】:

      我怀疑,就像其他人提到的那样,您在类接口声明(@interface 块,可能在 .h 文件中)和方法实现(在 @implementation 块内)中对方法的命名不同.当 Objective-C 编译器遇到未知方法时,它假定输入参数的类型为 id(对象引用)。因此,当遇到使用AndY: 命名的方法时,它无法识别该方法(选择器区分大小写)并假定输入应该是id 类型。由于您正在传递float 类型的输入,因此您会收到警告。显然,当方法被识别并且编译器知道输入是float 类型时,您不会收到警告。

      【讨论】:

        【解决方案4】:

        我怀疑如果你错误地命名了方法,你会得到一个不同的警告(initWithX:AndY: method not found)。

        返回的头文件中的声明是什么?将方法声明为

        - (NSObject*)initWithX:(float)inX And​​Y:(float)inY;

        例如,会给你这个警告。

        【讨论】:

        • 签名返回一个id。 - (id)initWithX:(float)x andY:(float)y;
        【解决方案5】:

        这里似乎还有其他东西在起作用,我不完全确定是什么。

        我阅读了可可指南和命名方法主题,其中说不要使用和链接关键字,感谢 Toon Van Acker 提供链接。

        我删除了“andY:”,将其简单地替换为“y:”,无论我做了多少次清理和重建,警告都消失了。

        我仍然不明白为什么这会导致编译器抛出警告。尽管它违反了命名方法指南,但在标头和实现中匹配的方法签名......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-15
          • 2011-08-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-06
          • 2010-11-03
          相关资源
          最近更新 更多