当我在IOS项目中使用ARC时,如何使用void *?

时间:2012-07-07 15:41:15

标签: objective-c automatic-ref-counting void-pointers

LooK这个方法:     beginAnimations:背景:    这是UIView类的方法。上下文需要参数是一种void-pointer,我需要将UIImageView发送到上下文。    我收到一个警告,当我使用ARC时,我已经禁止使用void *。那么除了不使用ARC之外,我怎样才能将UIImageView发送到上下文。

1 个答案:

答案 0 :(得分:0)

上面的评论为这个特定情况提供了正确的答案(使用基于块的动画方法),但一般来说,如果你有一个API,它接受一个上下文void *并且你想要传递一个对象,我发现最好将id转换为CFTypeRef,这样就可以在指针上获得手动内存管理语义(CFTypeRefvoid *的typedef)等。但是,这需要调用回调 才能释放对象(即转换回ARC的内置管理)。

以下是我梦寐以求的一些想象API的例子:

- (void) doSomethingWithObject: (id) object {
    // use CFBridgingRetain() to turn object into a manually-retained CFTypeRef/void*
    [someObject performBackgroundTaskWithTarget: self
                                       selector: @selector(bgTask:)
                                        context: CFBridgingRetain(object)];
}

- (void) bgTask: (void *) context
{
    // use CFBridgingRelease() to turn our void*/CFTypeRef into an ARC-managed id
    id object = CFBridgingRelease((CFTypeRef)context);
    ...
}