我有这门课:
@interface G2Matrix : NSObject
...
- (id) initWithArray:(float *)val;
...
@end
下面的这一行向我发出警告,指出方法 initWithArray 的第一个参数具有不兼容的指针类型:
float m[16];
...
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease];
如果我将方法名称更改为 initWithArray1 之类的名称,则警告就会消失。我知道基础类中的某些对象有一个同名的方法,但我是从 NSObject 派生的,它没有这个方法。给出了什么?
其他信息 - 我从 G2Matrix 类中的其他 init 方法调用相同的 initWithArray 方法,但我没有看到警告。
最佳答案
据猜测,这是一个类型问题:
在其他 init 方法中,您可以调用 [self initWithArray:...]
。 self
的类型为 G2Matrix*
。在这种情况下,编译器可以完全解析哪个 imp
(C 函数指针)最终将处理方法调用,并正确检测其签名(参数和返回类型)。
在常规代码中,[G2Matrix alloc]
返回一个 id
。在这种情况下,编译器只能告诉方法选择器,该方法选择器将在运行时绑定(bind)到 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 编译器标志。
关于objective-c - 不兼容的指针类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5113447/