繁体   English   中英

为什么此指针类型不兼容

[英]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:'的方法”。 如果我是对的,这就是您遇到的问题:

  1. 该选择器附带两个方法签名。 NSArray使用NSArray*而您使用CGPDFArrayRef

  2. alloc返回id 这意味着编译器不知道它将返回什么类(是的,编译器那么厚)。

  3. 然后,您将initWithArray:发送到此神秘对象。 编译器说:“天哪,我不知道这是哪种对象,所以我无法确定哪种方法签名是正确的。我会快速旋转,无论我面对的是我所面对的那个。我会选择。” 它选择NSArray的签名。 然后,它查看参数并说:“嘿,那不是NSArray!错误!”

快速简便的解决方案是将其更改为[[(Dest*)[Dest alloc] initWithArray:array] autorelease] 更好的解决方案是为您的方法选择一个不同的选择器。

哦,不要那样做。 只有CFArrayRef被“免费桥接”到NSArray 但是, CGPDFArrayRef完全不同CGPDFArrayRef兼容。 不能将它们用作NSArray

PDF API肯定看起来像是与Core Foundation兼容的标准,但实际上不是。

根据Apple的文档

CGPDFArray头文件定义了封装PDF数组的不透明类型

因此它不能用作NSArray

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM