使用Init方法的Obj-C分配警告

时间:2009-07-16 17:24:07

标签: objective-c

我将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:”,警告就会消失。

为什么会这样?当然,我的方法的命名不应该影响它的返回类型??


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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

- (NSObject*)initWithX:(float)inX AndY:(float)inY;
例如,

会给你这个警告。

答案 4 :(得分:1)

这里似乎有其他工作,我不完全确定是什么。

我阅读了cocoa指南和命名方法主题,它说不使用和链接关键字,感谢Toon Van Acker的链接。

我删除了“andY:”只是为了“y:”进行交换,警告已经消失,无论我做了多少次清理和重建。

我仍然不明白为什么这会导致编译器发出警告。即使它违反命名方法指南,方法签名在标题和实现中匹配......