【问题标题】:When I have use ARC in IOS project,how can I use void *?当我在 IOS 项目中使用 ARC 时,如何使用 void *?
【发布时间】:2012-07-07 15:41:15
【问题描述】:

看这个方法: 开始动画:上下文: 这是 UIView 类的一个方法。 context 需要参数,它是一种 void-pointer,我需要将 UIImageView 发送到 context。 我收到一条警告,上面说当我使用 ARC 时 void* 已被禁止。那么除了不使用 ARC 之外,我如何将 UIImageView 发送到上下文。

【问题讨论】:

  • 使用 UIView 的块动画方法。这更方便,因为您不需要在其他地方使用动画完成委托。
  • 加上文档说要使用块动画方法。
  • 感谢帮助。我会学习使用UIView的块动画方法。

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


【解决方案1】:

上面的 cmets 为这种特殊情况提供了正确的答案(使用基于块的动画方法),但一般来说,如果你有一个 API 接受上下文 void * 并且你想传递一个对象,我发现最好将您的id 转换为CFTypeRef,这样您就可以在指针上获得手动内存管理语义(CFTypeRefvoid * 的类型定义)等。但是请注意,这需要回调 必须调用才能释放您的对象(即转换回 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);
    ...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2013-10-14
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多