在Monotouch中正确放置NSTimer

问题描述

在我的应用中,我需要一个一次性计时器,该计时器将执行一项操作,并且永远不会再次使用。我最近一直在降低性能,并想知道这样做的正确方法是什么。 如果我执行以下操作:
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);
        }
    }
}