Ich verwende eine Bibliothek eines Drittanbieters, die einen C-Rückruf in einem iOS-Programm erfordert. Der Rückruf bietet einen void*
userdata-Parameter, den ich verwenden kann, wie ich es wünsche. In diesem Rückruf möchte ich ein NSData-Objekt erstellen, das an den Code zurückgegeben wird, der die API aufruft, die schließlich den Rückruf aufruft. Zum Beispiel:
Ich verwende ARC, was meiner Meinung nach die Ursache der Probleme ist. Ich dachte daran, eine Struktur zu verwenden, um die NSData*
zu halten, aber ARC verbietet Objective-C-Objekte in Strukturen oder Vereinigungen. Es gibt wahrscheinlich eine Variante von __bridge
, die helfen könnte, aber ich bin mir nicht sicher welche. Ich habe viele SO-Fragen angeschaut und die Apple-Dokumente gelesen, aber mir ist nicht klar, wie ich das programmieren soll.
Wenn d zum Zeitpunkt des Rückrufs idealerweise nicht null wäre, würde der aktuelle Wert freigegeben und ein neues NSData-Objekt würde ihn ersetzen. Mit anderen Worten, wenn library_api abgeschlossen ist, hält d immer das NSData-Objekt, das durch den Rückruf erstellt wurde, und jeder zuvor gehaltene Wert wäre korrekt freigegeben worden.
Ich nehme an, ich könnte den Objective-C-Code aus dem Callback heraushalten und nur malloc()
einen Puffer, um die Daten zu speichern, die dann in ein NSData-Objekt im Hauptcode kopiert werden, aber ich hoffe, dass ich es vermeiden kann dieser zusätzliche Schritt.
Sie können struct ObjC Objekt haben, sie müssen nur __unretained_unsafe
ODER in .mm Datei sein.
Es gibt wenige Optionen:
1 Verwenden Sie eine Struktur, um das ObjC-Objekt in der .m-Datei zu speichern
%Vor% 2 Verwenden Sie eine Struktur, um ObjC-Objekt in .mm -Datei (Objective-C ++) zu halten, und verwenden Sie C ++ new/delete
für die Struktur. Sie können dies tun, weil der Compiler retain / release im Konstruktor / Destruktor der Struktur generiert.
3 Ändere die Signatur der Callback-Funktion und wirke sie (das habe ich vorher nicht versucht)
4 Machen Sie diese Datei nicht ARC mit -fno-objc-arc
Compiler-Flag
Tags und Links objective-c ios automatic-ref-counting callback