gpt4 book ai didi

objective-c - 不兼容的指针类型

转载 作者:行者123 更新时间:2023-12-04 06:33:34 25 4
gpt4 key购买 nike

我有这个类:

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com