【问题标题】:Several problems with the Objective-C ARC conversionObjective-C ARC转换的几个问题
【发布时间】:2011-10-14 00:19:42
【问题描述】:

我正在尝试将我的代码转换为 Objective-C ARC 并遇到一些错误。

1.:

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

它说:ARC 不允许将 Objective.C 指针隐式转换为“void *”

2.:

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

它说:ARC 不允许将非 Objective-C 指针类型“void *”隐式转换为“NSBezierPath *”

有什么想法,我该如何解决这些问题?

【问题讨论】:

    标签: objective-c automatic-ref-counting


    【解决方案1】:

    您需要使用bridged casts。在这种情况下,您只需要简单的 __bridge 修饰符,例如

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

    static void CGPathCallback(void *info, const CGPathElement *element) {
        NSBezierPath *path = (__bridge NSBezierPath*)info;
        ...
    }
    

    【讨论】:

    • 谢谢!第二个代码有效,但您的第一个解决方案不起作用。我得到:将'CGPathRef'(又名'const struct CGPath *)传递给'void *'类型的参数会丢弃限定符。
    • @Flocked:对不起,我没有意识到这是一个void* 参数。您可以使用(__bridge void *),我会更新我的答案以反映这一点。
    猜你喜欢
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-02-10
    相关资源
    最近更新 更多