我是否应该保留对 NSData 对象的 C# 引用,直到我确定 iOS 中的基础本机调用是否已完成使用它?

Should I keep the C# reference to an NSData object around until I know for sure that an underlying native call in iOS has finished using it or not?

提问人:XDS 提问时间:11/10/2023 最后编辑:XDS 更新时间:11/11/2023 访问量:46

问:

我正在处理 C# 与 iOS 的绑定,我对参数传递的某些方面感到好奇。假设我们有以下一段代码:

            public void BeginNativeCallFromCsharpToIOS(byte[] data)
            {
                var nsData = NSData.FromArray(data);

                 // non blocking    takes 1 minute to complete
                _theNativeIosObject.BeginNativeCallToIosHere(nsData);
            }

我想知道在此代码示例中,在底层 iOS 操作(异步)设法在 iOS 本机模式下完全完成之前,csData 变量是否会由 C# 垃圾收集器自动处置。

因为如果 nsData 确实在上面收集了垃圾,那么我担心底层的原生 ns-array 对象将有资格损坏(并可能导致整个应用程序崩溃)。

如果是这样的话,我正在考虑重构代码,以便在处理_nsData时更加谨慎:

private NSData _nsData;
public void BeginNativeCallFromCsharpToIOS(byte[] data)
{
     _nsData = NSData.FromArray(data);

     // non blocking    takes 1 minute to complete
     _theNativeIosObject.BeginNativeCallToIosHere(nsData);
}

// later on when we are notified that the native call has completed
public void Cleanup()
{
     _nsData?.Dispose();
     _nsData = null;
}

这真的有必要吗?有什么想法吗?

C# .NET Xamarin 垃圾回收 Maui

评论

1赞 Jianwei Sun - MSFT 11/14/2023
关于这一点,可以检查以下情况:垃圾回收和引用计数如何在 Xamarin 中携手工作Xamarin iOS 内存到处泄漏

答: 暂无答案