【问题标题】:Why is this pointer type incompatible为什么这个指针类型不兼容
【发布时间】:2011-04-09 22:10:03
【问题描述】:

这是代码

目标.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;

目标.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;
}

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

【问题讨论】:

    标签: iphone objective-c ios


    【解决方案1】:

    我感觉你漏掉了另一个相关的警告——“警告:找到了多个名为 'initWithArray:' 的方法”。如果我是对的,这就是您遇到的问题:

    1. 该选择器有两个方法签名。 NSArray 采用 NSArray*,而您采用 CGPDFArrayRef

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

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

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

    【讨论】:

    • 同意;像initWithCGPDFArrayRef: 这样的东西可能会更好。
    • 只有一个警告,但您仍然是正确的。我确实重命名了方法,警告消失了。谢谢。
    【解决方案2】:

    哦,不要那样做。只有CFArrayRefs '免费桥接'到NSArray。但是,CGPDFArrayRef 完全不同且不兼容。您可以将它们用作NSArrays。

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

    【讨论】:

    • 他在哪里把它当作一个 NSArray?
    【解决方案3】:

    来自Apple's documentation

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

    所以它不能用作NSArray

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-17
      • 2012-07-20
      • 2014-12-28
      • 1970-01-01
      • 2017-12-14
      相关资源
      最近更新 更多