为什么这个指针类型不兼容

时间:2010-09-08 19:08:07

标签: iphone objective-c ios

这是代码

Dest.h

#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;

Dest.m

@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;
}

显然,编译器认为该数组与initWithArray:中声明的Dest.h不兼容。但据我所知,类型是完全正确的。我甚至从Dest.h复制了声明并将其粘贴到Dest.m中。 initWithArray:编译好。在CGPDFArray.h中添加/删除Dest.h头文件没有任何区别,编译器认为它不是Dest.h中的int。

3 个答案:

答案 0 :(得分:6)

我有一种感觉,你会遗漏另一个相关的警告 - “警告:多个方法名为'initWithArray:'found”。如果我是对的,那就是你遇到的问题:

  1. 该选择器有两种方法签名。 NSArray需要NSArray*而你的CGPDFArrayRef

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

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

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

答案 1 :(得分:1)

哦,不要那样做。只有CFArrayRef被{免费桥接'到NSArray。然而,CGPDFArrayRef完全不同且不兼容。您可以将其用作NSArray s。

PDF API确实看起来像标准的 Core Foundation 兼容,但实际上并非如此。

答案 2 :(得分:0)

来自Apple's documentation

  

CGPDFArray头文件定义了一个   封装PDF的opaque类型   阵列

所以它不能用作NSArray

相关问题