在Monotouch中正确处理NSTimer

时间:2011-04-27 14:44:52

标签: iphone ios ipad xamarin.ios

在我的应用程序中,我需要一个可以执行操作并且永远不会再次使用的一次性计时器。我最近一直在打击表现,并且想知道这样做的正确方法是什么。

如果我执行以下操作:

NSTimer.CreateScheduledTimer(10, delegate {
    Console.WriteLine("Timer fired!");
    // other non-trivial code here
});

一旦这个问题解决了,Mono的GC会自动清理吗?或者更好的是创建对此计时器的引用(NSTimer timer = NSTimer.CreateScheduledTimer())然后自己处理它?<​​/ p>

这是否适用于可以类似方式实例化的其他对象?

2 个答案:

答案 0 :(得分:3)

您的示例代码可能就是您的选择。定时器点火后GC会清理。您可能希望保留对计时器的引用的唯一原因是您希望在某个时刻取消计时器。

答案 1 :(得分:1)

我使用这个小帮手。好的是,它可以在所有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);
        }
    }
}