问题描述
在我的应用中,我需要一个一次性计时器,该计时器将执行一项操作,并且永远不会再次使用。我最近一直在降低性能,并想知道这样做的正确方法是什么。
如果我执行以下操作:
NSTimer.CreateScheduledTimer(10,delegate {
Console.WriteLine(\"Timer fired!\");
// other non-trivial code here
});
一旦触发,Mono的GC会自动清除吗?还是最好创建对此计时器的引用(NSTimer timer = NSTimer.CreateScheduledTimer()
)然后自己处理?
这是否适用于可以类似方式实例化的其他对象?
解决方法
您的示例代码可能是解决方法。计时器触发后,GC将在某个时间清理。您可能希望保留对计时器的引用的唯一原因是,如果您想在某个时候取消计时器。
,我用这个小帮手。好消息是它可以在所有NSObject派生类中使用,并在从ObjC转换代码时有所帮助,因为它几乎是同一调用。
namespace MonoTouch.Foundation.Extensions
{
public static class CoreFoundationExtensions
{
/// <summary>
/// Performs the selector.
/// </summary>
/// <param name=\'obj\'>
/// Object.
/// </param>
/// <param name=\'action\'>
/// Action.
/// </param>
/// <param name=\'delay\'>
/// Delay.
/// </param>
public static void PerformSelector (this NSObject obj,NSAction action,float delay)
{
int d = (int)(1000 * delay);
var thread = new Thread(new ThreadStart ( () => {
using(var pool = new NSAutoreleasePool())
{
Thread.Sleep (d);
action.Invoke ();
}
}));
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// Performs the selector.
/// </summary>
/// <param name=\'obj\'>
/// Object.
/// </param>
/// <param name=\'action\'>
/// Action.
/// </param>
public static void PerformSelector (this NSObject obj,NSAction action)
{
PerformSelector (obj,action,0.001f);
}
}
}