Objective-C到C到C#统一包装可能导致内存泄漏?
我正在编写一个unity插件,将本机iOS功能连接到unity 我必须做的一件事是将字符串从Objective-C(iOS)发回C#(Unity),这是通过编写一个简单的C外部函数来完成的 我发现这个帖子: 建议使用可通过C extern返回的helper函数:Objective-C到C到C#统一包装可能导致内存泄漏?,c#,ios,objective-c,c,memory-leaks,C#,Ios,Objective C,C,Memory Leaks,我正在编写一个unity插件,将本机iOS功能连接到unity 我必须做的一件事是将字符串从Objective-C(iOS)发回C#(Unity),这是通过编写一个简单的C外部函数来完成的 我发现这个帖子: 建议使用可通过C extern返回的helper函数: // Helper method to create C string copy char* MakeStringCopy (const char* string) { if (string == NULL)
// 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;
}
我对Unity不是很精通,所以我不知道这是否会导致内存泄漏
从纯Objective-C的角度来看,函数
return cStringCopy([objc_status UTF8String]);
string someInfo = SDKWrapper_getInfo();
因此,原始字符串使用的内存由Objective-C自动管理,但是
一旦Unity收到char指针,它会自动释放分配的内存吗?
C#unity脚本使用如下函数:
return cStringCopy([objc_status UTF8String]);
string someInfo = SDKWrapper_getInfo();
这个问题的答案是:
(我认为)这与此有关,因此它确实让我觉得我这里有内存泄漏。是的,这会泄漏内存。解决方案是将托管内存块(即
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);
}
您可以在上看到类似的示例。接受的答案是错误的。尽管有些人提到这种方式会导致内存泄漏,但这是不对的。这种方法在Unity中运行良好,不会发生泄漏(我多次测试过)。那 从本机方法返回的字符串值应该是UTF–8编码的,并在堆上分配。单编组对这样的字符串调用是免费的
您可能想阅读以下关于返回
char*
的答案: