Objective c 不兼容的指针 ;类型

Objective c 不兼容的指针 ;类型,objective-c,Objective C,我有这门课: @interface G2Matrix : NSObject ... - (id) initWithArray:(float *)val; ... @end 下面这行给我一个警告,说明initWithArray方法的第一个参数具有不兼容的指针类型: float m[16]; ... G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease]; 如果我将方法名称更改为类似initWithArray1

我有这门课:

@interface G2Matrix : NSObject 

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

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

float m[16];
...
G2Matrix* matrix = [[[G2Matrix alloc] initWithArray:m] autorelease];
如果我将方法名称更改为类似initWithArray1的名称,警告将消失。我知道基础类中的一些对象有一个同名的方法,但是我是从NSObjor派生出来的,它没有这个方法。有什么好处


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

@tathagata这是因为initWithArray是在NSArray类中定义的方法,所以除非您将NSArray类子类化,否则无法使用它

请参阅NSArray上的文档

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

猜测一下,这是一个类型问题:

在其他init方法中,调用
[self initWithArray:…]
self
被键入为
G2Matrix*
。在这种情况下,编译器可以完全解析哪个
imp
(C函数指针)将最终处理方法调用,并正确检测其签名(参数和返回类型)

在常规代码中,
[G2Matrix alloc]
返回一个
id
。在此上下文中,编译器只能告诉方法选择器,它将在运行时绑定到
imp
。它必须猜测哪一个<>代码>数组:你的意思是,正如你可以从警告中看到的,它猜错了,因为一个基金会类有一个<代码> iNITSUnt::/Clult>具有不同签名的方法。您的代码仍然可以工作,编译器只是不能确定

为initMethod选择唯一的名称(
initWithFloats:
maybe?)是关闭警告的推荐方法。其他的方法是:把它分成两行;或将alloc返回值强制转换为正确的类:

G2Matrix *matrix = [G2Matrix alloc];
matrix = [[matrix initWithArray:pointerToFloats] autorelease];
// or
G2Matrix* matrix = [[(G2Matrix *)[G2Matrix alloc] initWithArray:m] autorelease];

看起来有点奇怪,但允许您重新打开“将警告视为错误”编译器标志。

解释了发生的情况以及避免警告的方法。是的,这与我的答案中的方法是一样的。事实并非如此。使用与另一个方法共享选择器的方法通常没有问题。如果方法具有不同的签名,这是一个坏主意(因为编译器需要知道签名才能生成正确的代码,并且它只能在知道对象的类型时才能这样做),而对于具有不同签名的init方法,这是一个特别坏的主意(因为
alloc
总是返回类型不确定的对象)@Chuck+1,你是对的,只有签名相同的方法才有意义。谢谢你的解释,建议使用“正确”的方法名--“initWithFloats”听起来更正确!