Objective-C a C a C # envoltorio de unidad posiblemente causando pérdida de memory?

Estoy escribiendo un plugin de unidad para conectar la funcionalidad de iOS nativo a Unity.

Una de las cosas que tengo que hacer es enviar cadenas desde Objective-C (iOS) a C # (Unity) que se logra escribiendo una function C externa simple.

Encontré este post:

https://forum.unity3d.com/threads/plugins-sending-string-data.66435/

Lo que sugiere usar esta function auxiliar que se puede devolver a través de C extern:

// Helper method to create C string copy char* MakeStringCopy (const char* string) { if (string == NULL) return NULL; char* res = (char*)malloc(strlen(string) + 1); strcpy(res, string); return res; } 

No soy muy hábil con Unity, así que no sé si esto está causando una pérdida de memory o no.

Mirándolo desde el puro punto de vista del Objetivo-C, la function

  1. toma un puntero char
  2. asigna espacio de memory basado en la longitud de la cadena original
  3. copy la cadena original en este espacio recién asignado
  4. devuelve el nuevo puntero copydo

La function helper se usa dentro de la function C extern así:

 return cStringCopy([objc_status UTF8String]); 

Por lo tanto, la memory utilizada por la cadena original es gestionada automáticamente por Objective-C, sin embargo …

Una vez que Unity recibe el puntero char, ¿desasignará automáticamente la memory asignada?

El script de unidad C # usa la function como esta:

 string someInfo = SDKWrapper_getInfo(); 

La respuesta de esta pregunta:

Cómo convertir entre un puntero C # String y C Char

Tipo de relación con esto (creo), por lo que realmente me hace pensar que tengo una pérdida de memory aquí.

Sí, esto perderá memory. La solución sería pasar un fragment gestionado de memory (es decir, un StringBuilder ) a la function nativa, es decir:

 [DllImport(...)] private static extern int GetInfo ([MarshalAs(UnmanagedType.LPWStr)]StringBuilder dst, int dstCapacity); private void SomeMethod() { var sb = new StringBuilder(8192); // perhaps the function can indicate whether the capacity was large enough var success = GetInfo(sb, sb.Capacity); } 

Puede ver un ejemplo similar en esta página .