2011-04-27 62 views
3

在我的應用程序中,我需要一個關閉計時器,它將執行一個動作並永不再使用。最近我一直在鎮壓性能,並且想知道正確的做法是什麼。在Monotouch中正確處理NSTimer

如果我做到以下幾點:

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

一旦這已經解僱,這是怎麼回事通過Mono的GC可以自動的清理?或者最好是創建一個對這個定時器的引用(NSTimer timer = NSTimer.CreateScheduledTimer()),然後自己處理它?

這是否適用於可以類似方式實例化的其他對象?

回答

3

您的示例代碼可能是要走的路。定時器啓動後,GC會清理一段時間。你可能想要保持對定時器的引用的唯一原因是如果你想在某個時候取消定時器。

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); 
     } 
    } 
}