Правильная утилизация NSTimer в Monotouch - PullRequest
3 голосов
/ 27 апреля 2011

В моем приложении мне нужен таймер отключения, который будет выполнять действие и никогда не будет использоваться снова. В последнее время я снижал производительность и задавался вопросом, каким будет правильный способ сделать это.

Если я сделаю следующее:

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

После того, как это сработало, будет ли оно автоматически очищаться GC Mono? Или было бы лучше создать ссылку на этот таймер (NSTimer timer = NSTimer.CreateScheduledTimer()), а затем утилизировать его самостоятельно?

Применимо ли это к другим объектам, которые могут быть созданы аналогичным образом?

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Ваш пример кода, вероятно, лучший путь. GC будет очищаться через некоторое время после срабатывания таймера. Единственная причина, по которой вы можете захотеть сохранить ссылку на таймер, заключается в том, что вы хотите отменить таймер в какой-то момент.

1 голос
/ 09 мая 2011

Я использую этого маленького помощника.Хорошо то, что он может использоваться во всех классах, производных от 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...