不兼容的指针类型

时间:2011-02-25 03:59:38

标签: objective-c

我有这堂课:

@interface G2Matrix : NSObject 

...
- (id) initWithArray:(float *)val;
...

@end

下面这一行给出了一个警告,说明initWithArray方法的第一个参数有一个不兼容的指针类型:

float m[16];
...
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease];

如果我将方法名称更改为类似initWithArray1,则警告消失。我知道基础类中的一些对象有一个同名的方法,但我是从NSObject派生的,它没有这个方法。是什么给了什么?

其他信息 - 我从G2Matrix类中的其他init方法调用相同的initWithArray方法,但我没有看到那里的警告。

2 个答案:

答案 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的文档

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html

PS。 通过使用该方法,我的意思是为您的目的覆盖现有方法,这不是一个好主意,您可以在文档中找到子类注释。