我将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'没有使警告消失。我清理了所有目标,并重建并且没有显示警告。但它在经过另一次重新编译后又回来了。奇
答案 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:”进行交换,警告已经消失,无论我做了多少次清理和重建。
我仍然不明白为什么这会导致编译器发出警告。即使它违反命名方法指南,方法签名在标题和实现中匹配......