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

标签 iphone objective-c ios

这是代码

目的地.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.m 中。 initWithArray: 编译正常。添加/删除 Dest.h 中的 CGPDFArray.h 头文件没有任何区别,编译器不认为它是 Dest 中的 int。 h.

最佳答案

我觉得您漏掉了另一个相关的警告 —“警告:找到了多个名为‘initWithArray:’的方法”。如果我是对的,这就是您遇到的情况:

  1. 该选择器有两个方法签名。 NSArray 接受一个 NSArray*,而你的接受一个 CGPDFArrayRef

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

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

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

关于iphone - 为什么这个指针类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3671097/

相关文章:

iOS:具有透明背景的模态 ViewController

ios - 使用框架!和模型未找到构建错误

ios - 使用不同的构建配置时,Xcode 调试器值为 nil

iphone - 通过 segue 发送自定义单元格

iphone - 如何以人类可读的形式获取 iOS 根证书列表

iPhone 应用程序 - 弹出对话框 - 有点

iphone:在将条目添加到可变字典中 setObject:forKey: 和 setValue:forKey: 有什么区别

ios - 导航栏一旦隐藏(滑动)就不会回来

ios - 使用标签栏 Controller 展开和 popviewcontroller

ios - Swift:什么时候执行 Dismiss View 的完成 block ?