[英]Why is this pointer type incompatible
这是代码
#import <UIKit/UIKit.h>
#import <CoreGraphics/CGPDFArray.h>
@class Model;
// snip
@interface Dest : NSObject
{
CGPDFArrayRef destArray;
DestKind kind;
}
+ (id)destWithObject:(CGPDFObjectRef)obj inModel:(Model*)model;
- (id)initWithArray:(CGPDFArrayRef)array;
@implementation Dest
+ (id)destWithObject:(CGPDFObjectRef)obj inModel:(PDFModel*)model
{
CGPDFArrayRef array = NULL;
Dest* dest = nil;
// stuff to create array
if (array)
{
dest = [[[Dest alloc] initWithArray:array] autorelease];
<path>/Dest.m:63: warning: passing argument 1 of 'initWithArray:' from incompatible pointer type
}
return dest;
}
显然,编译器认为该数组与Dest.h
声明的initWithArray:
不兼容。 但据我所知,这种类型是完全正确的。 我什至从Dest.h
复制了声明,并将其粘贴到Dest.m
。 initWithArray:
编译正常。 添加/删除的CGPDFArray.h
在头文件Dest.h
没有任何区别,编译器不会认为它是一个int Dest.h
。
我感觉到您遗漏了另一个相关的警告-“警告:发现了多个名为'initWithArray:'的方法”。 如果我是对的,这就是您遇到的问题:
该选择器附带两个方法签名。 NSArray使用NSArray*
而您使用CGPDFArrayRef
。
alloc
返回id
。 这意味着编译器不知道它将返回什么类(是的,编译器那么厚)。
然后,您将initWithArray:
发送到此神秘对象。 编译器说:“天哪,我不知道这是哪种对象,所以我无法确定哪种方法签名是正确的。我会快速旋转,无论我面对的是我所面对的那个。我会选择。” 它选择NSArray的签名。 然后,它查看参数并说:“嘿,那不是NSArray!错误!”
快速简便的解决方案是将其更改为[[(Dest*)[Dest alloc] initWithArray:array] autorelease]
。 更好的解决方案是为您的方法选择一个不同的选择器。
哦,不要那样做。 只有CFArrayRef
被“免费桥接”到NSArray
。 但是, CGPDFArrayRef
完全不同CGPDFArrayRef
兼容。 您不能将它们用作NSArray
。
PDF API肯定看起来像是与Core Foundation兼容的标准,但实际上不是。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.