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

标签 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 方法,但我没有看到警告。

最佳答案

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

在其他 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/

相关文章:

objective-c - 在 MobileSafari 中实现 apt

python - 引用 socket 时出现问题

iphone - 这两个会生成相同的编译时间吗?

ios - 与一名委托(delegate)和许多发件人的协议(protocol)?

ios - UICollectionview 水平和垂直滚动

ios - Objective-c 正则表达式无法正常工作

ios - 使用 ios 更新用户配置文件?

ios - 每次用户点击图像时,在可缩放的 UIImageView 上绘制一个小方 block 。并缩放正方形

objective-c - 帮助我理解堆栈跟踪

objective-c - 如何比较两个 NSInteger?