我正在使用 Box2D (C++),我创建了一个 Objective-C 对象并将其分配给 Box2D 主体的userData
属性,该属性的类型为void*
.
现在在某些情况下,void* userData
可能是对该 ObjC 对象的唯一活动引用。因此,因为我(__bridge void*)
在作业中使用了ARC,所以放手了。这是我需要解决的问题。
我一直在思考防止这种情况发生的选项?我阅读了Clang 的 ARC 文档,特别是关于桥梁铸造的部分(以及关于 SO 的问答)以及对他们认为“格式错误”的各种桥梁铸造结构点头。
不过,我的第一个想法是(__bridge_retained void*)
在对 userData 的初始分配中使用。但这让我想知道如何平衡保留?我显然不能向对象发送释放。
那么我必须要CFRelease()
对象吗?还是需要CFBridgingRelease()
?还是在这里都是非法的?
(__bridge_transfer void*)
从userData
临时 id 类型转换是否足够,可能在之后将 userData 设置为 NULL 时?这甚至是个好主意吗?
我知道另一种方法是为对象保留一个单独的NSArray
/并使它们与 Box2D 主体的生命周期保持同步,与它们的 Box2D 主体同步添加和删除它们。NSDictionary
userData
但这感觉有点矫枉过正,因为在这里我知道我在做什么,我知道+1
只要 Box2D 主体处于活动状态,我就需要该对象,而-1
当 Box2D 主体被移除时,我需要该对象。另外,我知道只有两种方法可以添加和删除 Box2D 主体,并且userData
在我的框架中甚至无法直接访问,因为所有 Box2D 对象都隐藏在 Objective-C 接口/包装器后面。
暂时将可能“格式不正确”放在一边,您建议我在这种情况下应该做什么?