私は Box2D (C++) を使用しており、Objective-C オブジェクトを作成し、それを Box2D 本体のuserData
プロパティに割り当てますvoid*
。
場合によっては、void* userData
その ObjC オブジェクトへの唯一のアクティブな参照である可能性があります。そのため、(__bridge void*)
課題で使用したため、ARCは手放しています。それは私が修正する必要があるものです。
これが起こらないようにするためのオプションを熟考してきましたか?Clang の ARC ドキュメント、具体的にはブリッジ キャスティングに関する部分 (および SO に関する Q&A)を読み、「不適切な形式」であると見なされるさまざまなブリッジ キャスティング コンストラクトにうなずきます。
それでも、最初に考えたのは(__bridge_retained void*)
、userData への最初の割り当てで使用することでした。しかし、それは保持のバランスをどのようにとるか疑問に思いましたか?明らかに、オブジェクトにリリースを送信できません。
CFRelease()
それで、私はオブジェクトに行かなければなりませんか?または、そうする必要がありますCFBridgingRelease()
か?それとも両方ともここでは違法ですか?
おそらく後で userData を NULL に設定している間、一時的な id タイプへの(__bridge_transfer void*)
キャストで十分ですか? userData
それは良い考えですか?
別の方法として、オブジェクトに対して個別のNSArray
/を保持し、それらを Box2D 本体の有効期間と同期させ、Box2D 本体と同期して追加および削除することを知っています。NSDictionary
userData
しかし、これはやり過ぎのように感じます。なぜなら、ここで私は自分が何をしているのかを知っているからです+1
。Box2D 本体がアクティブである限りオブジェクトが必要であり-1
、Box2D 本体が削除されたときにオブジェクトが必要であることを知っています。さらに、Box2D 本体を追加および削除するメソッドは 2 つしかなくuserData
、すべての Box2D オブジェクトが Objective-C インターフェイス/ラッパーの背後に隠されているため、私のフレームワークでは直接アクセスすることさえできないことを知っています。
「形式が正しくない」可能性はさておき、この状況で私がすべきことをお勧めしますか?