Почему этот тип указателя несовместим - PullRequest
0 голосов
/ 08 сентября 2010

Это код

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 не имеет никакого значения, компилятор не считает, что это int в Dest.h.

Ответы [ 3 ]

6 голосов
/ 08 сентября 2010

У меня такое чувство, что вы пропускаете другое уместное предупреждение - "предупреждение: несколько методов с именем 'initWithArray:' found". Если я прав, то вот с чем вы столкнулись:

  1. Есть две сигнатуры метода, которые идут с этим селектором. NSArray's берет NSArray*, а ваш CGPDFArrayRef.

  2. alloc возвращает id. Это означает, что компилятор не имеет представления, какой класс он возвращает (да, он такой толстый).

  3. Затем вы отправляете initWithArray: этому загадочному объекту. Компилятор говорит: «Черт возьми, я не знаю, что это за объект, поэтому я не могу решить, какая сигнатура метода верна. Я выберу. " Он выбирает подпись NSArray. Затем он смотрит на аргумент и говорит: «Эй, это не NSArray! Ошибка!»

Быстрое и простое решение - изменить его на [[(Dest*)[Dest alloc] initWithArray:array] autorelease]. Лучшее решение - выбрать отдельный селектор для вашего метода.

1 голос
/ 08 сентября 2010

О, не делай этого. Только CFArrayRef s являются "бесплатными мостами" для NSArray. CGPDFArrayRef, однако, совершенно другой и несовместимый. Вы можете не использовать их как NSArray с.

PDF API, безусловно, выглядит как стандартный Core Foundation совместимый, но на самом деле это не так.

0 голосов
/ 08 сентября 2010

С Документация Apple ,

Заголовочный файл CGPDFArray определяет непрозрачный тип, который инкапсулирует PDF массив

, поэтому его нельзя использовать как NSArray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...