我有这堂课:
@interface G2Matrix : NSObject
...
- (id) initWithArray:(float *)val;
...
@end
下面这一行给出了一个警告,说明initWithArray方法的第一个参数有一个不兼容的指针类型:
float m[16];
...
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease];
如果我将方法名称更改为类似initWithArray1,则警告消失。我知道基础类中的一些对象有一个同名的方法,但我是从NSObject派生的,它没有这个方法。是什么给了什么?
其他信息 - 我从G2Matrix类中的其他init方法调用相同的initWithArray方法,但我没有看到那里的警告。
答案 0 :(得分:3)
猜测,这是一个类型问题:
在其他init方法中,您调用[self initWithArray:...]
。 self
被输入为G2Matrix*
。在此上下文中,编译器可以完全解析哪个imp
(C函数指针)最终将处理方法调用,并正确检测其签名(参数和返回类型)。
在常规代码中,[G2Matrix alloc]
会返回id
。在此上下文中,编译器只能告诉方法选择器,它将在运行时绑定到imp
。它必须猜测你的意思是initWithArray:
,并且从警告中可以看出它猜错了,因为基础类有一个initWithArray:
方法,具有不同的签名。你的代码仍然有效,编译器无法确定。
为initMethod选择一个唯一的名称(可能是initWithFloats:
?)是建议关闭警告的方法。其他方法是:将其分成两行;或者将alloc返回值强制转换为正确的类:
G2Matrix *matrix = [G2Matrix alloc];
matrix = [[matrix initWithArray:pointerToFloats] autorelease];
// or
G2Matrix* matrix = [[(G2Matrix *)[G2Matrix alloc] initWithArray:m] autorelease];
看起来有点奇怪,但允许你重新打开treat-warnings-as-errors编译器标志。
答案 1 :(得分:0)
@tathagata那是因为initWithArray是在NSArray类中定义的方法,因此除非您继承NSArray类,否则不能使用它。
请参阅有关NSArray的文档
PS。 通过使用该方法,我的意思是为您的目的覆盖现有方法,这不是一个好主意,您可以在文档中找到子类注释。