Objective-C to C to C# unity wrapper 可能导致内存泄漏?

Poc*_*chi 5 c c# memory-leaks objective-c ios

我正在编写一个统一插件来将原生 iOS 功能连接到 Unity。

我必须做的一件事是将字符串从 Objective-C(iOS) 发送回 C#(Unity),这是通过编写一个简单的 C extern 函数来完成的。

我找到了这个帖子:

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

这建议使用这个可以通过 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;
}
Run Code Online (Sandbox Code Playgroud)

我对 Unity 不是很精通,所以我不知道这是否导致内存泄漏。

从纯Objective-C的角度来看,函数

  1. 接受一个字符指针
  2. 根据原字符串的长度分配一些内存空间
  3. 将原始字符串复制到这个新分配的空间中
  4. 返回新复制的指针

辅助函数在 C extern 函数中使用,如下所示:

return cStringCopy([objc_status UTF8String]);
Run Code Online (Sandbox Code Playgroud)

所以原始字符串使用的内存由Objective-C自动管理,但是......

一旦Unity收到char指针,它会自动释放分配的内存吗?

C# unity 脚本使用如下函数:

string someInfo = SDKWrapper_getInfo();
Run Code Online (Sandbox Code Playgroud)

这个问题的答案:

如何在 C# 字符串和 C Char 指针之间进行转换

有点与此有关(我认为),所以它真的让我觉得我在这里有内存泄漏。

Gro*_*roo 0

是的,这会泄漏内存。解决方案是将托管内存块(即 a StringBuilder)传递给本机函数,即:

[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);
}
Run Code Online (Sandbox Code Playgroud)

您可以在此页面上看到类似的示例。