Xamarin.Mac nasıl çalışır?

Çoğu zaman, geliştiricilerin Xamarin. Mac ' in iç "Magic" i için hiçbir zaman endişelenmenize gerek kalmaz. Bu durumda, nesnelerin bir C# merceği ve hata ayıklama sorunlarıyla karşılaştıklarında her ikisinin de nasıl çalıştığına ilişkin kabaca bir şekilde anlaşılmasına yardımcı olur.

Xamarin. Mac ' de bir uygulama iki adet bir şekilde köprüler: Objective-C yerel sınıfların (,, vb.) örneklerini içeren tabanlı çalışma zamanı vardır NSStringNSApplication ve yönetilen sınıfların (, System.StringHttpClient , vb.) örneklerini içeren C# çalışma zamanı vardır. Bu iki çalışma LDS arasında, Xamarin. Mac iki yönlü köprü oluşturur. bu nedenle, bir uygulamanın içindeki Yöntemleri (seçiciler) çağırabilmesi Objective-CNSApplication.Init ve Objective-C uygulamanın C# yöntemlerini geri çağırması (uygulama temsilcisiyle ilgili yöntemler gibi). Genel olarak, ' a çağrıları Objective-CObjective-C Invoke aracılığıyla saydam olarak işlenir ve Xamarin 'in bazı çalışma zamanı kodu sağlar.

C# sınıflarını/yöntemlerini gösterme Objective-C

Bununla birlikte, Objective-C bir uygulamanın C# nesnelerine geri dönmek için, bu uygulamaların anlayabilmesi için bir şekilde sunulmaları gerekir Objective-C . Bu, Register ve öznitelikleri aracılığıyla yapılır Export . Aşağıdaki örneğe göz atın:

[Register ("MyClass")]
public class MyClass : NSObject
{
   [Export ("init")]
   public MyClass ()
   {
   }

   [Export ("run")]
   public void Run ()
   {
   }
}

Bu örnekte, Objective-C çalışma zamanı artık MyClass ve adlı seçicilerin adlı bir sınıf hakkında bilgi sahibi init olur run .

Çoğu durumda, bir uygulamanın aldığı en geri çağırmaları sınıflarda geçersiz kılınan yöntemler aracılığıyla base (örneğin, AppDelegateDelegates , DataSources ) veya API 'lere geçilen base , bu geliştirici tarafından yoksayılanabilen bu bir uygulama ayrıntılarıdır. Bu durumların tümünde, Export C# kodunda öznitelikler gerekli değildir.

Oluşturucuyu çalıştırma

Çoğu durumda, geliştirici, Objective-C film şeridi veya XIB dosyalarında çağrıldığında gibi yerlerden örneklendirilebileceği şekilde uygulamanın C# sınıfları oluşturma API 'sini çalışma zamanına kullanıma sunmalıdır. Xamarin. Mac uygulamalarında kullanılan en yaygın beş Oluşturucu aşağıda verilmiştir:

// Called when created from unmanaged code
public CustomView (IntPtr handle) : base (handle)
{
   Initialize ();
}

// Called when created directly from a XIB file
[Export ("initWithCoder:")]
public CustomView (NSCoder coder) : base (coder)
{
   Initialize ();
}

// Called from C# to instance NSView with a Frame (initWithFrame)
public CustomView (CGRect frame) : base (frame)
{
}

// Called from C# to instance NSView without setting the frame (init)
public CustomView () : base ()
{
}

// This is a special case constructor that you call on a derived class when the derived called has an [Export] constructor.
// For example, if you call init on NSString then you don’t want to call init on NSObject.
public CustomView () : base (NSObjectFlag.Empty)
{
}

Genel olarak, Geliştirici IntPtrNSCoder özel tek gibi bazı türler oluştururken oluşturulan ve oluşturuculardan ayrılmalıdır NSViews . Xamarin. Mac, bir çalışma zamanı isteğine yanıt olarak bu oluşturuculardan birini çağırmalıdır Objective-C ve kaldırdıysanız, uygulama yerel kod içinde çöker ve tamamen sorunu anlamak zor olabilir.

Bellek yönetimi ve döngüleri

Xamarin. Mac ' de bellek yönetimi, Xamarin. iOS 'a çok benzer şekilde benzerdir. Ayrıca, bu belgenin kapsamının ötesinde karmaşık bir konudur. Lütfen bellek ve performans En Iyi uygulamalarınıokuyun.

Zamanın önünde derlenmesi

Genellikle, .NET uygulamaları derlendiklerinde makine koduna derlenmez, bunun yerine, uygulama başlatıldığında makine koduna derlenen IL kodu adlı bir ara katmana derlenirler.

Mono çalışma zamanı 'nı JıT derlemesine almak için gereken süre bu makine kodu, gerekli makine kodunun oluşturulması sırasında zaman alacağından, Xamarin. Mac uygulamasını %20 ' ye varan bir şekilde başlatmayı yavaşlatabilir.

İOS üzerinde Apple tarafından uygulanan sınırlamalar nedeniyle, Il kodunun JıT derlemesi Xamarin. iOS için kullanılamaz. Sonuç olarak, tüm Xamarin. iOS uygulamaları, derleme çevrimi sırasında makine koduna derlenen tam zaman (AOT).

Xamarin. Mac ' e yeni, yalnızca Xamarin. iOS gibi, uygulama derleme döngüsünün içinde Il kodunu AOT özelliğidir. Xamarin. Mac, gereken makine kodunun çoğunu derleyen bir karma AOT yaklaşımı kullanır, ancak çalışma zamanının gerekli trampolines 'ları derlemesine ve yansıma. yayma (ve şu anda Xamarin. Mac üzerinde çalışan diğer kullanım durumlarını) desteklemeye devam etmesine izin verir.

AOT 'nin bir Xamarin. Mac uygulamasına yardımcı olabilecek iki büyük alan vardır:

  • Daha iyi "yerel" kilitlenme günlükleri -bir Xamarin. Mac uygulaması, ortak COA API 'lerinde (bunu kabul etmeyen bir yönteme gönderme gibi) geçersiz çağrılar yaparken yaygın olarak karşılaşılan bir örnek olan yerel kodda KILITLENIRSE, JIT çerçevelerinden gelen yerel kilitlenme günlüklerinin çözümlenmesi zordur. JıT çerçeveleri hata ayıklama bilgilerine sahip olmadığından, onaltılık uzaklıklarla birden çok satır olacak ve bunlarla ilgili hiçbir clue olmayacaktır. AOT, "Real" adlı çerçeveler oluşturur ve izlemeler daha kolay okunabilir. Bu, Xamarin. Mac uygulamasının lldb ve gereçlergibi yerel araçlarla daha iyi etkileşime geçebileceği anlamına da gelir.
  • Daha iyi başlatma süresi performansı -büyük Xamarin. Mac uygulamaları için, birden çok saniyelik bir başlangıç süresi ile, tüm kodun JIT derlenmesi önemli miktarda zaman alabilir. AOT bu kadar ön çalışır.

AOT derlemesini etkinleştirme

Çözüm GezginiProject adına çift tıklanarak, Xamarin. mac ' te AOT etkinleştirilir, Mac derlemesi 'ne gidiliyor ve ek mmp bağımsız değişkenlerine ekleme: alan (burada, aot türünü denetleyen bir veya daha fazla seçenek aşağıda verilmiştir). Örnek:

Adding AOT to additional mmp argumentsEk MMP

Önemli

AOT derlemesini etkinleştirmek, bazen birkaç dakikaya kadar, derleme süresini önemli ölçüde artırır, ancak uygulama başlatma sürelerini ortalama %20 oranında artırabilir. Sonuç olarak, AOT derlemesi yalnızca bir Xamarin. Mac uygulamasının yayın yapılarında etkinleştirilmelidir.

AOT derleme seçenekleri

Bir Xamarin. Mac uygulamasında AOT derlemesini etkinleştirirken ayarlanabilecek birkaç farklı seçenek vardır:

  • none -AOT derlemesi yok. Bu varsayılan ayardır.
  • all -AOT MonoBundle 'daki her derlemeyi derler.
  • core -AOT, Xamarin.MacSystem ve derlemelerini derler mscorlib .
  • sdk -AOT, Xamarin.Mac ve temel sınıf kitaplıkları (BCL) derlemelerini derler.
  • |hybrid -Bunu Yukarıdaki seçeneklerden birine eklemek, karma AOT 'nin kullanılmasına olanak tanır, ancak daha uzun derleme sürelerine neden olur.
  • + -AOT derlemesi için tek bir dosya içerir.
  • - -AOT derlemeden tek bir dosyayı kaldırır.

Örneğin, --aot:all,-MyAssembly.dll MonoBundle içindeki tüm derlemeler ÜZERINDE AOT derlemesini etkinleştirir --aot:all,-MyAssembly.dllMyAssembly.dll ve --aot:core|hybrid,+MyOtherAssembly.dll,-mscorlib.dll karma 'ı etkinleştirecektir, kod AOT, öğesini içerir MyOtherAssembly.dll ve hariç tutar mscorlib.dll .

kısmi statik registrar

Bir Xamarin. Mac uygulaması geliştirirken, bir değişikliği tamamlama ve test etme işlemlerinin son tarihleri için önemli hale gelebilmesi arasındaki süreyi en aza indirir. Kod tabanlarının ve birim testlerin modüler olması gibi Stratejiler, bir uygulamanın pahalı bir tam yeniden oluşturma gerektirmesinin sayısını azalttıkları için derleme sürelerinin azalmasına yardımcı olabilir.

Ayrıca, Xamarin. Mac için de yeni olan kısmi statik (Xamarin. iOS tarafından yapılan), hata ayıklama yapılandırmasındaki bir Xamarin. Mac uygulamasının başlatma sürelerini önemli ölçüde azaltabilir. Kısmi statik kullanmanın, Registrar hata ayıklama başlatma bölümünde neredeyse bir 5x iyileştirmesi olduğunu anlamak, ne registrar olduğunu, farkın statik ve dinamik arasında ne olduğunu ve bu "kısmi statik" sürümünün ne olduğunu gösteren bir arka plan alır.

NSApplication.Init () . Bu, Xamarin. Mac ' de birlikte COA API 'lerinin herhangi bir kullanmanın NSApplication.Init önce çağrılması gerekir.

İşi,, registrarObjective-C ve gibi sınıfların türevi olan uygulamanın C# sınıflarının varlığını bilgilendirmek için kullanılır NSApplicationDelegateNSViewNSWindowNSObject . Bu, kayıt ihtiyaçlarını ve her türde hangi öğelerin raporlanacağını belirlemek için uygulamadaki tüm türlerin taramasını gerektirir.

Bu tarama, bir derleme süresi adımı olarak, yansıma ile uygulamanın başlangıcında ya da statikolarak, dinamikolarak yapılabilir. Kayıt türü seçerken, geliştirici aşağıdakilerin farkında olmalıdır:

  • Statik kayıt başlatma sürelerini önemli ölçüde azaltabilir, ancak derleme sürelerini önemli ölçüde yavaşlatır (genellikle Double hata ayıklama oluşturma süresinden daha fazla). Bu, yayın yapılandırma derlemeleri için varsayılan değer olacaktır.
  • Dinamik kayıt, uygulama başlatma ve kod oluşturmayı atana kadar bu çalışmayı geciktir, ancak bu ek iş, uygulama başlangıcında fark edilebilir bir duraklama (en az iki saniye) oluşturabilir. Bu, özellikle dinamik kaydın varsayılan değeri olan ve Reflection 'ın daha yavaş olduğu hata ayıklama yapılandırma Derlemeleriyle görülür.

İlk olarak Xamarin. iOS 8,13 ' de tanıtılan kısmi statik kayıt, geliştiriciye her iki seçenekten de en iyi şekilde olanak sağlar. İçindeki her öğenin kayıt bilgilerini önceden hesaplayarak Xamarin.Mac.dll ve bu bilgileri bir statik kitaplıkta Xamarin. Mac ile teslim ederek (yalnızca derleme zamanında bağlantısı olması gerekir), Microsoft derleme süresini etkilemeden dinamik bir yansıma zamanının çoğunu kaldırmış olur registrar .

{1} Adding the partial static <span class= ek MMP bağımsız değişkenlerine " registrar Data-LinkType =" göreli yol "/> ek MMP bağımsız değişkenlerine ekleme

Ek kaynaklar

İşlerin nasıl dahili olarak çalıştığı hakkında daha ayrıntılı açıklamalar aşağıda verilmiştir: