【发布时间】:2013-01-24 19:10:22
【问题描述】:
我正在使用 Box2D (C++),我创建了一个 Objective-C 对象并将其分配给 Box2D 主体的 userData 属性,该属性的类型为 void*。
现在,在某些情况下,void* userData 可能是对该 ObjC 对象的唯一活动引用。因此,因为我在作业中使用了(__bridge void*),所以 ARC 放手了。这是我需要解决的问题。
我一直在思考如何防止这种情况发生?我阅读了Clang's ARC documentation,特别是关于桥梁铸造的部分(以及关于 SO 的问答)以及对他们认为“不正确”的各种桥梁铸造结构点头。
不过,我的第一个想法是在对 userData 的初始分配中使用 (__bridge_retained void*)。但这让我想知道如何平衡保留?我显然无法向对象发送释放。
所以我必须CFRelease() 对象吗?还是需要CFBridgingRelease()?还是在这里都是非法的?
(__bridge_transfer void*) 从userData 转换为临时 id 类型是否足够了,也许在之后将 userData 设置为 NULL?这是个好主意吗?
我知道另一种方法是为userData 对象保留一个单独的NSArray/NSDictionary,并使它们与 Box2D 主体的生命周期保持同步,并与它们的 Box2D 主体同步添加和删除它们。
但这感觉有点矫枉过正,因为在这里我知道自己在做什么,我知道只要 Box2D 主体处于活动状态,我就需要 +1 对象,而当 Box2D 主体被移除时,我需要 -1 对象.另外,我知道只有两种方法可以添加和删除 Box2D 主体,并且在我的框架中甚至无法直接访问 userData,因为所有 Box2D 对象都隐藏在 Objective-C 接口/包装器后面。
暂时搁置可能“格式不正确”,您建议我在这种情况下应该怎么做?
【问题讨论】:
-
@Emil:感谢修复内联代码,我正打算自己做。
-
没问题,我必须承认在一个 20k 用户的帖子中编辑如此琐碎的事情很奇怪!哈:D
-
是的,有时我会问一些非常愚蠢的问题:)
标签: objective-c casting automatic-ref-counting void-pointers