Несколько проблем с преобразованием ARC в Objective-C

Я пытаюсь преобразовать свой код в Objective-C ARC и получаю несколько ошибок.

1.:

NSBezierPath *path = [NSBezierPath bezierPath];
CGPathApply(pathRef,  path, CGPathCallback); //error

В нем говорится: неявное преобразование указателя Objective.C в «void *» запрещено с помощью ARC.

2.:

static void CGPathCallback(void *info, const CGPathElement *element) {
NSBezierPath *path = info; //error
[…] }

В нем говорится: неявное преобразование типа указателя не-Objective-C «void *» в «NSBezierPath *» запрещено с ARC.

Любые идеи, как я могу решить проблемы?


person Flocked    schedule 14.10.2011    source источник


Ответы (1)


Вам необходимо использовать приведение мостов. В этом случае вам просто нужен простой модификатор __bridge, например.

NSBezierPath *path = [NSBezierPath bezierPath];
CGPathApply(pathRef, (__bridge void *)path, CGPathCallback);

и

static void CGPathCallback(void *info, const CGPathElement *element) {
    NSBezierPath *path = (__bridge NSBezierPath*)info;
    ...
}
person Lily Ballard    schedule 14.10.2011
comment
Спасибо! Второй код работает, но ваше первое решение не работает. Я получаю: при передаче «CGPathRef» (он же «const struct CGPath *») параметру типа «void *» квалификаторы отбрасываются. - person Flocked; 14.10.2011
comment
@Flocked: Извините, я не знал, что это параметр void*. Вы можете просто использовать (__bridge void *), и я обновлю свой ответ, чтобы отразить это. - person Lily Ballard; 14.10.2011