img*_*x64 0 xamarin.ios ios xamarin
在Xamarin文档Foundation.NSObject,在生命周期节,它说:
当调用返回NSObject的方法或属性时,也会按需创建C#NSObject。此时,运行时将调查对象缓存,并确定给定的Objective-C NSObject是否已浮出水面。如果对象已浮出水面,则将返回现有对象,否则将调用以IntPtr作为参数的构造函数来构造该对象。
有没有办法从我的代码中做到上述几点?换句话说,给定一个IntPtr句柄,我可以得到一个NSObject已经存在的C#,或者让Xamarin创建一个不存在的C#吗?
我要执行上述操作的原因是,我想保留IntPtrC#的句柄,NSObject然后再保留Dispose()它。在代码的NSObject后面,我想从中得到支持IntPtr。
究其原因我想上面做的是,我读过足够的文档,博客和SO 阙小号TI Ø NS关于C#垃圾收集和Xamarin.iOS本地引用计数对象之间的互动,我决定Dispose() 一切,只要可能。因此,在所有方法中,using只要有NSObject参数就使用。例如:
[Foundation.Action("buttonPressed:")]
public void RatingButtonTapped(UIButton button) {
using (button) {
Console.WriteLine("Hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我UIButton在初始化期间保留了对较早版本的引用,则在运行此操作时将对其进行处理。因此,我计划保留该IntPtr句柄,并UIButton在以后需要时重新获取它。
您可以使用此方法获取句柄的托管对象:
ObjCRuntime.Runtime.GetNSObject (handle);
Run Code Online (Sandbox Code Playgroud)
但是请记住,如果释放了本机对象,则会崩溃。
如果您不想崩溃,则需要保留本机句柄,然后在不再需要它时将其释放。
如果添加逻辑以保留+释放本机句柄,则也可以保留托管对象,并且仅在确定不再需要该对象时才调用Dispose。
奇怪的是,您链接到XY问题,并且陷入了一个确切的陷阱:您的实际问题是内存泄漏(我认为,但您没有解释),并且您正在询问尝试的解决方案(处理)一切)。
但这是解决问题的错误方法。使用该解决方案将使您陷入痛苦的世界(您已经找到了一个解决方案,如果继续使用手柄,您将陷入更糟糕的境地:如何解决崩溃而不是解决内存泄漏问题) )。
正确的解决方案是:
| 归档时间: |
|
| 查看次数: |
1223 次 |
| 最近记录: |