Ich arbeite mit Box2D (C++) und ich erstelle ein Objective-C-Objekt und weisen Sie es einem Box2D-Körper userData
-Eigenschaft, die vom Typ void*
ist.Wie kann ein ID-Objekt in einem C++ - void * -Member unter ARC sicher gespeichert werden, wenn keine anderen Verweise auf das Objekt bestehen?
Jetzt kann in einigen Fällen die void* userData
die einzige aktive Referenz auf dieses ObjC-Objekt sein. Deshalb, weil ich (__bridge void*)
in der Zuordnung verwendet habe, lässt ARC es los. Das muss ich beheben.
Ich habe über die Optionen nachgedacht, um dies zu verhindern? Ich lese Clang's ARC documentation, speziell die Teile über Brückenguss (sowie Q & A auf SO) sowie Nicken zu den verschiedenen Brückenguss-Konstrukte, die sie als "schlecht geformt" betrachten.
Noch war mein erster Gedanke, (__bridge_retained void*)
in der ursprünglichen Zuordnung zu userData zu verwenden. Aber das brachte mich dazu, mich zu fragen, wie man das ausgleicht? Ich kann offensichtlich keine Freigabe an das Objekt senden.
Also müsste ich CFRelease()
das Objekt? Oder müsste es CFBridgingRelease()
sein? Oder sind beide hier illegal?
Ist ein (__bridge_transfer void*)
Umwandlung von userData
zu einem temporären ID-Typ genug, vielleicht beim Einstellen von userData auf NULL hinterher? Ist das überhaupt eine gute Idee?
weiß, dass ich die Alternative ein separates NSArray
/NSDictionary
für die userData
Objekte und sie mit der Lebensdauer des Box2D Körpers synchron halten zu halten wäre, das Hinzufügen und sie synchron mit ihrem Box2D Körper zu entfernen.
Aber das fühlt sich an wie viel des Guten, weil hier ich weiß, was ich tue, ich weiß, ich muss so lange das Objekt +1
für so der Box2D Körper aktiv ist, und -1
das Objekt, wenn der Box2D Körper entfernt wird. Außerdem weiß ich, dass es nur zwei Methoden gibt, mit denen die Box2D-Körper hinzugefügt und entfernt werden, und der direkte Zugriff auf userData
ist in meinem Framework nicht möglich, da alle Box2D-Objekte hinter Objective-C-Schnittstellen/Wrappern verborgen sind.
Vielleicht einen Moment lang "schlecht gebildet" beiseite legen, was würden Sie mir empfehlen, sollte ich in dieser Situation tun?
@Emil: Danke für die Korrektur des Inline-Codes, ich wollte es gerade selbst machen. – LearnCocos2D
Kein Problem, ich muss zugeben, dass es seltsam war, solch eine triviale Sache in einem 20k-User Post zu bearbeiten! Ha: D – Emil
Ja manchmal frage ich wirklich stoopid Fragen :) – LearnCocos2D