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

0 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;
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

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

Chu*_*uck 6

我有一种感觉,你会遗漏另一个相关的警告 - "警告:多个方法名为'initWithArray:'found".如果我是对的,这就是你遇到的:

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

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

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

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