在Xamarin文档Foundation.NSObject
,在Lifecycle section,它说:也是按需创建获取Xamarin.iOS NSObject的从IntPtr的(新的或缓存)处理
C#NSObjects当你调用一个方法或属性,返回一个NSObject。此时,运行时将查看对象缓存并确定给定的Objective-C NSObject是否已经出现在受管理的世界中。如果对象已经出现,则返回现有对象,否则调用将IntPtr作为参数的构造函数来构造该对象。
有没有办法从我的代码做到上述?换句话说,给定一个IntPtr
句柄,如果它已经存在,我可以得到一个C#NSObject
,或者如果它不存在,让Xamarin创建一个新的?
我想这样做的原因是我想保留一个C#NSObject
的IntPtr
句柄,然后Dispose()
它。在代码后面,我想从IntPtr
得到NSObject
。
The reason I want to do the above是我读够了documentation,blogs和SO que小号tiØns关于C#垃圾收集和Xamarin.iOS本地引用计数的对象,我决定Dispose()
一切之间的相互作用,只要可能。所以在所有方法中,只要我得到NSObject
参数,我就使用using
。例如:
[Foundation.Action("buttonPressed:")]
public void RatingButtonTapped(UIButton button) {
using (button) {
Console.WriteLine("Hello world");
}
}
所以,如果我一直保持到初始化期间UIButton
早参考,运行这个动作时将布置。相反,我计划保留IntPtr
句柄,并在稍后需要时重新获取UIButton
。
你是对的,但我真正的*实际* **实际**问题是,我试图找到一种一致的方式来管理内存*之前*我甚至开始项目。我刚刚完成了一个Xamarin.Android应用程序,因为我不了解C#GC如何与Java GC交互(我最终放弃并偶尔调用GC.Collect()),导致内存泄漏。所以我想从这个新项目开始时就要格外小心,现在做一些愚蠢的事情来学习,而不是在项目结束的时候太迟地学习它们。 – imgx64
是的,谢谢,我已经编辑了答案。 –